https://code.visualstudio.com/docs/editor/variables-reference#_common-questions
Visual Studio Code在调试和任务配置文件以及某些选择设置中支持变量替换。使用$ {variableName}
语法在键和值字符串launch.json
以及tasks.json
文件中支持变量替换。
预定义变量
- 支持以下预定义变量:
${workspaceRoot}
-VSCode中打开文件夹的路径 the path of the folder opened in VS Code
$ {workspaceFolder}
-在VS Code中打开的文件夹的路径
$ {workspaceFolderBasename}
-在VS Code中打开的文件夹名称,不带任何斜杠(/)
$ {file}
-当前打开的文件
$ {relativeFile}
-相对于当前打开的文件workspaceFolder
$ {relativeFileDirname}
-相对于当前打开的文件的目录名workspaceFolder
$ {fileBasename}
-当前打开的文件的基本名称
$ {fileBasenameNoExtension}
-当前打开的文件的基本名称,没有文件扩展名
$ {fileDirname}
-当前打开的文件的目录名
$ {fileExtname}
-当前打开的文件的扩展名
$ {cwd}
-启动时任务运行器的当前工作目录
$ {lineNumber}
-活动文件中当前选择的行号
$ {selectedText}
-活动文件中的当前选定文本
$ {execPath}
-正在运行的VS Code可执行文件的路径
$ {defaultBuildTask}
-默认构建任务的名称 - 预定义变量的例子
假设您具有以下要求:
- 位于
/home/your-username/your-project/folder/file.ext
您的编辑器中打开的文件; - 目录
/home/your-username/your-project
将作为您的根工作区打开。
因此,每个变量将具有以下值:
$ {workspaceFolder} -/home/your-username/your-project
$ {workspaceFolderBasename} -your-project
$ {file} -/home/your-username/your-project/folder/file.ext
$ {relativeFile} -folder/file.ext
$ {relativeFileDirname} -folder
$ {fileBasename} -file.ext
$ {fileBasenameNoExtension} -file
$ {fileDirname} -/home/your-username/your-project/folder
$ {fileExtname} -.ext
$ {lineNumber} -光标的行号
$ {selectedText} -在代码编辑器中选择的文本
$ {execPath} -Code.exe的位置
提示:在
tasks.json
和launch.json
内部的字符串值使用智能感知获得预定义变量的完整列表。
- 每个工作空间文件夹范围内的变量
通过将根文件夹的名称附加到变量(用冒号分隔),可以进入工作空间的同级根文件夹。如果没有根文件夹名称,则该变量的作用域为使用该文件夹的相同文件夹。
例如,在具有文件夹Server
和Client
的多根工作区中,${workspaceFolder:Client}
表示Client根的路径。
环境变量
您也可以通过$ {env:Name}
语法引用环境变量(例如${env:USERNAME}
)。
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/app.js",
"cwd": "${workspaceFolder}",
"args": ["${env:USERNAME}"]
}
配置变量
您可以通过$ {config:Name}
语法(例如,${config:editor.fontSize}
)来引用VS Code设置(也称为“configurations
” )。
命令变量
如果上面的预定义变量不足,则可以通过$ {command:commandID}
语法将任何VS Code命令用作变量。
插入命令变量后,将运行命令,并用命令的(字符串)结果替换该变量。命令的实现范围从无UI的简单计算到基于VS Code扩展API可用的UI功能的一些复杂功能。
VS Code的Node.js调试器扩展中提供了此功能的示例,该扩展提供了一个交互式命令,extension.pickNodeProcess
用于从所有正在运行的Node.js进程的列表中选择单个进程。该命令返回所选进程的进程ID。这样就可以通过以下方式在“ 按进程ID附加”启动配置中使用该extension.pickNodeProcess
命令:
{
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach by Process ID",
"processId": "${command:extension.pickNodeProcess}"
}
]
}
输入变量
命令变量已经很强大,但是它们缺少一种机制来配置针对特定用例运行的命令。例如,不可能将提示消息或默认值传递给通用的“用户输入提示”。
此限制的解决,是输入变量具有的语法:${input:variableID}
。所述variableID指launch.json
和tasks.json
中inputs的条目部分,其中指定了额外的配置属性。
以下示例显示了task.json使用输入变量的的总体结构:
{
"version": "2.0.0",
"tasks": [
{
"label": "task name",
"command": "${input:variableID}"
// ...
}
],
"inputs": [
{
"id": "variableID",
"type": "type of input variable"
// type specific configuration attributes
}
]
}
当前,VS Code支持三种类型的输入变量:
- promptString:显示一个输入框,用于从用户那里获取字符串。
- pickString:显示一个“快速选择”下拉列表,使用户可以从多个选项中进行选择。
- command:运行任意命令。
每种类型都需要其他配置属性:
- promptString:
- 描述:快速输入中显示的内容为输入提供了上下文。
- default:如果用户未输入其他内容,将使用的默认值。
- pickString:
- 描述:快速选择中显示的内容为输入提供了上下文。
- options:供用户选择的选项数组。
- default:如果用户未输入其他内容,将使用的默认值。它必须是选项值之一。
- Command:
- command:命令正在变量插补上运行。
- args:传递到命令的实现的可选选项包。
以下是的示例tasks.json,说明了使用inputsAngular CLI 的用法:
{
"version": "2.0.0",
"tasks": [
{
"label": "ng g",
"type": "shell",
"command": "ng",
"args": ["g", "${input:componentType}", "${input:componentName}"]
}
],
"inputs": [
{
"type": "pickString",
"id": "componentType",
"description": "What type of component do you want to create?",
"options": [
"component",
"directive",
"pipe",
"service",
"class",
"guard",
"interface",
"enum",
"enum"
],
"default": "component"
},
{
"type": "promptString",
"id": "componentName",
"description": "Name your component.",
"default": "my-new-component"
}
]
}
运行示例:
输入示例
下面的示例演示如何在调试配置中使用command类型的用户输入变量,该变量使用户可以从特定文件夹中找到的所有测试用例的列表中选择一个测试用例。假定某个扩展提供了一个`extension.mochaSupport.testPicker``命令,该命令可将所有测试用例放置在可配置的位置,并显示一个选择器UI来选择其中的一个。命令输入的参数由命令本身定义。
{
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Run specific test",
"program": "${workspaceFolder}/${input:pickTest}"
}
],
"inputs": [
{
"id": "pickTest",
"type": "command",
"command": "extension.mochaSupport.testPicker",
"args": {
"testFolder": "/out/tests"
}
}
]
}
命令输入也可以与任务一起使用。在此示例中,使用了内置的Terminate Task命令。它可以接受参数以终止所有任务。
{
"version": "2.0.0",
"tasks": [
{
"label": "Terminate All Tasks",
"command": "echo ${input:terminate}",
"type": "shell",
"problemMatcher": []
}
],
"inputs": [
{
"id": "terminate",
"type": "command",
"command": "workbench.action.tasks.terminate",
"args": "terminateAll"
}
]
}
常见问题
- 用户和工作区设置中是否支持变量替换?
预定义变量在选定数量的设定键的被支持settings.json的文件,如终端cwd,env,shell和shellArgs的值。一些[settings](https://code.visualstudio.com/docs/getstarted/settings)像
window.title`一样有自己的变量:
"window.title": "${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}"
请参阅“设置”编辑器(Ctrl +,
)中的注释,以了解有关设置特定变量的信息。
-
为什么没有记录
$ {workspaceRoot}?
${workspaceRoot}
不建议使用该变量,${workspaceFolder}
以便更好地与[Multi-root Workspace](https://code.visualstudio.com/docs/editor/multi-root-workspaces)
支持保持一致。 -
我如何知道变量的实际值?
检查变量运行时值的一种简单方法是创建VS Code 任务,以将变量值输出到控制台。例如,要查看的解析值${workspaceFolder}
,您可以在以下目录中创建并运行以下简单的“ echo”任务(“ 终端” > “运行任务”)tasks.json
:
{
"version": "2.0.0",
"tasks": [
{
"label": "echo",
"type": "shell",
"command": "echo ${workspaceFolder}"
}
]
}