本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

变量参考

Visual Studio Code 支持在 调试任务 配置文件中进行变量替换,并且对一些特定的设置也支持。变量替换在一些键和值字符串中是支持的 launch.json任务.json 通过使用 ${variableName} 语法来引用文件。

预定义变量

以下预定义变量是受支持的:

变量 描述
${用户家目录} 用户主文件夹的路径
${工作区文件夹} 在 VS Code 中打开的文件夹路径
${工作区文件名} 在 VS Code 中打开的文件夹名称中没有斜杠 (/)
${文件} 当前打开的文件
${文件工作区文件夹} 当前打开文件的工作区文件夹
${相对文件} 当前打开的文件相对于工作区文件夹
${相对文件目录} 当前打开文件的dirname相对于工作区文件夹
${文件名} 当前打开文件的基名
${文件名无扩展名} 当前打开文件的不带文件扩展名的基名
${文件扩展名} 当前打开文件的扩展名
${文件目录} 当前打开文件的文件夹路径
${文件目录名文件名} 当前打开文件的文件夹名称
${当前工作目录} VS Code 启动时任务运行者的当前工作目录
${行号} 当前在活动文件中选中的行号
${列号} 当前在活动文件中选择的列数
${选定文本} 当前在活动文件中选择的文本
${执行路径} 运行 VS Code 可执行文件的路径
${默认构建任务} 默认构建任务的名称
${路径分隔符} 操作系统用于在文件路径中分隔组件的字符
${/} 简写为 ${pathSeparator}

预定义变量示例

假设你有以下条件:

  1. 位于的文件/home/你的用户名/你的项目/文件夹/文件扩展名在你的编辑器中打开;
  2. 目录/home/你的用户名/你的项目已打开为你的根工作区。

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

  • 用户主页/home/你的用户名
  • 工作区文件夹/home/你的用户名/你的项目
  • 工作区文件夹名称你的项目
  • 文件/home/你的用户名/你的项目/文件夹/文件扩展名
  • 文件工作区文件夹/home/你的用户名/你的项目
  • 相对文件文件夹/文件名.扩展名
  • 相对文件目录名文件夹
  • 文件名文件.扩展名
  • 文件名(不包括扩展名)文件
  • 文件扩展名.扩展名
  • 文件目录名/home/你的用户名/你的项目/文件夹
  • ${文件目录名文件名}文件夹
  • ${lineNumber}:光标的行号
  • 列号:光标的列号
  • 已选择文本:在你的代码编辑器中选择的文本
  • ${execPath}:Code.exe的位置
  • 路径分隔符输入:/在 macOS 或 Linux 上,输入:在 Windows 上
小贴士

在字符串值内使用IntelliSense任务.jsonlaunch.json获取预定义变量的完整列表。

平台和工作区考虑

平台特定行为

一些预定义变量在不同的操作系统上可能会有不同的解析结果:

  • Windows系统中,文件路径使用反斜杠 (输入:). 在JSON文件中组合路径时,例如任务.jsonlaunch.json确保反斜杠正确转义(例如:"${workspaceFolder}\\子目录")。
  • 在 macOS 和 Linux 上,文件路径使用正斜杠(输入:/)。

建议使用${路径分隔符}${/}为了使配置在不同平台上具有可移植性。

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

通过将根文件夹的名称附加到变量(用冒号分隔),可以访问工作区的同级根文件夹。如果不添加根文件夹的名称,该变量的作用域将限制在使用它的同一文件夹中。

例如,在一个具有文件夹的多根工作区中服务器客户,一个${工作区文件夹: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} 引用 编辑器.字体大小设置。

命令变量

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

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

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

{
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "通过进程ID附加",
      "processId": "${command:extension.pickNodeProcess}"
    }
  ]
}

当在中使用命令变量时launch.json配置,包含launch.json配置通过参数作为对象传递给命令。这使命令能够了解特定上下文和参数。launch.json当它们被调用时的配置。

输入变量

命令变量已经很强大了,但它们缺乏一种为特定用例配置正在运行的命令的机制。例如,无法将提示消息默认值传递给通用的“用户输入提示”。

这个限制通过输入变量解决,它们的语法是${输入:变量ID}变量ID指的是条目输入部分launch.json任务.json在其中指定附加配置属性。不支持输入变量的嵌套。

以下示例显示了一个整体结构任务.json利用输入变量:

{
  "版本": "2.0.0",
  "任务": [
    {
      "标签": "任务名称",
      "命令": "${输入:变量ID}"
      // ...
    }
  ],
  "输入": [
    {
      "ID": "变量ID",
      "类型": "输入变量的类型"
      // 类型特定的配置属性
    }
  ]
}

目前 VS Code 支持三种类型的输入变量:

  • 提示字符串:显示一个输入框,从用户那里获取一个字符串。
  • pickString:显示一个快速选择下拉菜单,允许用户从多个选项中进行选择。
  • 命令:运行任意命令。

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

提示字符串输入::

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

选择字符串输入::

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

选项可以是字符串值或具有标签和值的对象。下拉菜单将显示标签: 值.

命令输入::

  • 命令:在变量插值上运行命令。
  • 参数:传递给命令实现的可选选项包。

以下是示例任务.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.",
      "默认""my-new-component"
    }
  ]
}

运行示例:

输入示例

以下示例展示了如何使用用户输入变量类型命令在调试配置中,允许用户从特定文件夹中找到的所有测试案例列表中选择一个测试案例。假设某个扩展提供了一个extension.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": "终止所有"
    }
  ]
}

常见问题

在调试配置或任务中进行变量替换的详细信息

在调试配置或任务中进行变量替换是一个两步过程:

  • 在第一次扫描中,所有变量都被评估为字符串结果。如果一个变量出现多次,它只被评估一次。
  • 在第二次扫描中,所有变量都用第一次扫描的结果替换。

由此可以推知,对变量的评估(例如,在扩展中实现的基于命令的变量)无法访问调试配置或任务中的其他替代变量。它只能看到原始变量。这意味着变量之间不能相互依赖(这确保了隔离,并使替代在评估顺序方面对依赖顺序不敏感)。

用户和工作区设置中支持变量替换吗?

在某些设置键中支持预定义变量settings.json文件如终端当前工作目录环境外壳参数值。 一些设置如

Windows标题
  • 在 VS Code 中打开
  • 在 VS Code Insiders 中打开
有它们自己的变量:

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

在设置编辑器中查看注释 (⌘, (Windows, Linux Ctrl+,)) 以了解特定设置的变量。

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

变量${工作区根目录}被弃用以 favor of${工作区文件夹} 以更好地与 多根工作区 支持保持一致。

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

不是所有值在任务.json支持变量替换。具体来说,仅命令参数,和选项支持变量替换。输入变量在输入该部分将不会被解析,因为不支持输入变量的嵌套。

如何知道一个变量的实际值?

检查变量的运行时值的一种简单方法是创建一个 VS Code 任务,将变量值输出到控制台。例如,要查看 的解析值${工作区文件夹},你可以创建并运行(终端 > 运行任务)以下简单的‘echo’任务在任务.json输入::

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