变量参考

Visual Studio Code 支持在调试和任务配置文件中替换变量,并且在某些特定设置支持。在某些键和值字符串中支持变量替换launch.json以及tasks.json通过使用 ${variableName} 语法来文件。

预定义变量

支持以下预定义变量:

变量 描述
${userHome} 用户主文件夹的路径
${workspaceFolder} VS Code 中打开文件夹的路径
${workspaceFolderBasename} 在VS Code中打开的文件夹名称,没有任何斜杠(/)
${file} 当前已打开的文件
${fileWorkspaceFolder} 当前打开的文件工作区文件夹
${relativeFile} 当前打开的文件相对于workspaceFolder
${relativeFileDirname} 当前打开的文件名称相对于workspaceFolder
${fileBasename} 当前打开的文件基址名
${fileBasenameNoExtension} 当前已打开的文件基名,但没有文件扩展名
${fileExtname} 当前打开的文件扩展名
${fileDirname} 当前打开的文件文件夹路径
${fileDirnameBasename} 当前打开的文件文件夹名称
${cwd} VS Code 启动时任务运行器当前的工作目录
${lineNumber} 当前在活动文件中选中的行号
${columnNumber} 当前在活动文件中选中的列号
${selectedText} 当前在活动文件中选中的文本
${execPath} 运行中的VS Code可执行文件路径
${defaultBuildTask} 默认构建任务名称
${pathSeparator} 作系统用于区分文件路径中的组件的字符
${/} ${pathSeparator} 的简写

预定义变量示例

假设你有以下条件:

  1. 一个位于/home/your-username/your-project/folder/file.ext在编辑器中打开;
  2. 目录/home/your-username/your-project作为你的根工作区打开。

这导致每个变量的以下数值:

  • ${userHome}/首页/你的用户名
  • ${workspaceFolder}/home/your-username/your-project
  • ${workspaceFolderBasename}你的项目
  • ${file}/home/your-username/your-project/folder/file.ext
  • ${fileWorkspaceFolder}/home/your-username/your-project
  • ${relativeFile}folder/file.ext
  • ${relativeFileDirname}文件夹
  • ${fileBasename}file.ext
  • ${fileBasenameNoExtension}文件
  • ${fileExtname}.ext
  • ${fileDirname}/home/your-username/your-project/folder
  • ${fileDirnameBasename}文件夹
  • ${lineNumber}:光标的行号
  • ${columnNumber}:光标的列号
  • ${selectedText}:在你的代码编辑器中选择的文本
  • ${execPath}:Code.exe位置
  • ${pathSeparator}:macOS 或 linux 上,Windows 上/\
提示

使用IntelliSense内部字符串值tasks.json以及launch.json以获取预定义变量的完整列表。

平台与工作空间的考虑

平台特定行为

某些预定义变量的解析方式可能因作系统而异:

  • Windows上,文件路径使用反斜杠()。在 JSON 文件中编写路径时,例如\tasks.jsonlaunch.json,确保反斜线正确避开(例如:“${workspaceFolder}\\subdir”).
  • macOSLinux上,文件路径使用斜杠()。/

推荐使用它${pathSeparator}或者实现跨平台的配置可移植性。${/}

每个工作区文件夹的变量作用域

通过将根文件夹名称附加到变量后(用冒号分隔),可以进入工作区的兄弟根文件夹。如果没有根文件夹名称,变量的作用域会指向它使用的同一个文件夹。

例如,在带有文件夹的多根工作区中服务器以及客户, a${workspaceFolder:Client}指的是 的路径客户根。

环境变量

你可以用 ${env:Name} 语法引用环境变量。例如,${env:USERNAME} 引用用户名环境变量。

{
  "type": "node",
  "request": "launch",
  "name": "Launch Program",
  "program": "${workspaceFolder}/app.js",
  "cwd": "${workspaceFolder}",
  "args": ["${env:USERNAME}"]
}

配置变量

要参考 VS Code 的设置(配置),请使用 ${config:Name} 语法。例如,${config:editor.fontSize} 引用editor.fontSize环境。

命令变量

你可以用任何 VS Code 命令作为变量,语法是 ${command:commandID}

命令变量被替换为命令评估的(字符串)结果。命令的实现可以从简单的无界面计算,到基于VS Code扩展API中UI功能的复杂功能不等。如果命令返回的不是字符串,则变量替换不会完成。命令变量必须返回字符串。

该功能的示例出现在 VS Code 的 Node.js 调试器扩展中,它提供了一个交互式命令extension.pickNodeProcess从所有运行中的Node.js进程列表中选择单个进程。该命令返回所选进程的进程ID。这使得可以使用extension.pickNodeProcess通过进程 ID 附加启动配置中执行以下命令:

{
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Attach by Process ID",
      "processId": "${command:extension.pickNodeProcess}"
    }
  ]
}

当在launch.json构型,包围launch.json配置通过参数作为对象传递给命令。这使得命令能够了解具体的上下文和参数launch.json调用时配置。

输入变量

命令变量已经很强大,但缺乏针对特定用例配置命令的机制。例如,无法将提示消息默认值传递给通用的“用户输入提示”。

这一限制通过输入变量解决,输入变量的语法为 ${input:variableID}。该variableID指的是输入launch.json以及tasks.json,其中指定了额外的配置属性。不支持输入变量嵌套。

以下示例展示了 的整体结构tasks.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:显示快速选择下拉菜单,允许用户从多个选项中选择。
  • 命令:执行任意命令。

每种类型都需要额外的配置属性:

提示字符串:

  • 描述:快速输入中显示,为输入提供了上下文。
  • 默认值:如果用户未输入其他内容,将使用默认值。
  • password: 设置为 true,输入时会有一个不会显示输入值的密码提示。

拨弦字符串:

  • 描述:快速选择中显示,提供输入的上下文。
  • 选项:供用户选择的一系列选项。
  • 默认值:如果用户没有输入其他内容,将使用的默认值。必须是选项值之一。

选项可以是字符串值,也可以是既有标签又有值的对象。下拉菜单会显示标签:值

指挥:

  • 命令:运行一个关于变量插值的命令。
  • ARGS:可选项袋,传递给命令的实现。

下面是一个示例tasks.json说明了输入使用Angular 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"
      ],
      "default": "component"
    },
    {
      "type": "promptString",
      "id": "componentName",
      "description": "Name your component.",
      "default": "my-new-component"
    }
  ]
}

举个例子:

输入示例

以下示例展示了如何使用 类型的用户输入变量指挥在一个调试配置中,允许用户从特定文件夹中所有测试用例列表中选择一个测试用例。假设某个扩展提供了扩展.mochaSupport.testPicker命令将所有测试用例定位在可配置的位置,并显示选择器界面以选择其中一个。命令输入的参数由命令本身定义。

{
  "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"
      }
    }
  ]
}

命令输入也可以用于任务。在这个例子中,使用了内置的终止任务命令。它可以接受终止所有任务的参数。

{
  "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像终端这样的文件慢性消耗病,环境,贝壳以及shellArgs价值观。有些设置像

窗户标题
  • 在VS代码中打开
  • 在VS Code Insiders中开放
它们各自有变量:

  "window.title": "${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}"

请参阅设置编辑器中的注释(⌘,(Windows, Linux Ctrl+,)来了解设置特定的变量。

为什么${workspaceRoot}没有文档?

变量${workspaceRoot}被弃用,取而代之${workspaceFolder}以更好地与多根工作区支持保持一致。

为什么tasks.json中的变量没有被解决?

并非所有值都属于tasks.json支持变量替换。具体来说,仅支持。指挥,args, 和选项支持变量替换。输入变量在输入由于不支持输入变量嵌套,该节将无法解析。

我怎么知道变量的实际值?

检查变量运行时值的一个简单方法是创建一个 VS Code 任务,将变量值输出到控制台。例如,查看 的解析值${workspaceFolder}你可以创建并运行(终端 > 运行任务)以下简单的“回声”任务tasks.json:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "echo",
      "type": "shell",
      "command": "echo ${workspaceFolder}"
    }
  ]
}