參加你附近的 ,瞭解 VS Code 中的 AI 輔助開發。

變數引用

Visual Studio Code 支援在除錯任務配置檔案中以及一些選定的設定中使用變數替換。透過使用 ${variableName} 語法,可以在 launch.jsontasks.json 檔案中的某些鍵和值字串中支援變數替換。

預定義變數

支援以下預定義變數:

變數 描述
${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}: /home/your-username
  • ${workspaceFolder}: /home/your-username/your-project
  • ${workspaceFolderBasename}: your-project
  • ${file}: /home/your-username/your-project/folder/file.ext
  • ${fileWorkspaceFolder}: /home/your-username/your-project
  • ${relativeFile}: folder/file.ext
  • ${relativeFileDirname}: folder
  • ${fileBasename}: file.ext
  • ${fileBasenameNoExtension}: file
  • ${fileExtname}: .ext
  • ${fileDirname}: /home/your-username/your-project/folder
  • ${fileDirnameBasename}: folder
  • ${lineNumber}: 游標的行號
  • ${columnNumber}: 游標的列號
  • ${selectedText}: 程式碼編輯器中選定的文字
  • ${execPath}: Code.exe 的位置
  • ${pathSeparator}: macOS 或 Linux 上是 /,Windows 上是 \
提示

tasks.jsonlaunch.json 的字串值中使用 IntelliSense 以獲取預定義變數的完整列表。

每個工作區資料夾範圍的變數

透過將根資料夾的名稱附加到變數(用冒號分隔),可以訪問工作區的同級根資料夾。如果沒有根資料夾名稱,則變數的範圍限定為使用它的同一資料夾。

例如,在包含 ServerClient 資料夾的多根工作區中,${workspaceFolder:Client} 指的是 Client 根的路徑。

環境變數

您可以使用 ${env:Name} 語法引用環境變數。例如,${env:USERNAME} 引用 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}

命令變數將被替換為命令評估的(字串)結果。命令的實現範圍可以從沒有 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}"
    }
  ]
}

launch.json 配置中使用命令變數時,封閉的 launch.json 配置將作為物件透過引數傳遞給命令。這使得命令在被呼叫時可以瞭解特定 launch.json 配置的上下文和引數。

輸入變數

命令變數已經很強大,但它們缺乏一種機制來配置針對特定用例執行的命令。例如,不可能將提示訊息預設值傳遞給通用的“使用者輸入提示”。

這個限制透過輸入變數解決,其語法為 ${input:variableID}variableID 指的是 launch.jsontasks.jsoninputs 部分中的條目,其中指定了附加的配置屬性。不支援輸入變數的巢狀。

以下示例顯示了使用輸入變數的 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: 顯示一個快速選擇下拉選單,讓使用者從幾個選項中進行選擇。
  • command: 執行任意命令。

每種型別都需要額外的配置屬性:

promptString:

  • description: 顯示在快速輸入中,提供輸入的上下文。
  • default: 如果使用者沒有輸入其他內容,將使用的預設值。
  • password: 設定為 true 以使用密碼提示輸入,該提示不會顯示鍵入的值。

pickString:

  • description: 顯示在快速選擇中,提供輸入的上下文。
  • options: 使用者可選擇的選項陣列。
  • default: 如果使用者沒有輸入其他內容,將使用的預設值。它必須是選項值之一。

選項可以是一個字串值,也可以是一個同時包含標籤和值的物件。下拉選單將顯示標籤: 值

command:

  • command: 在變數插值時執行命令。
  • args: 傳遞給命令實現的可選選項包。

以下是一個 tasks.json 示例,演示瞭如何使用 Angular CLI 的 inputs

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

執行示例

Inputs Example

以下示例演示瞭如何在除錯配置中使用型別為 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"
      }
    }
  ]
}

命令輸入也可以與任務一起使用。在此示例中,使用了內建的終止任務命令。它可以接受一個引數來終止所有任務。

{
  "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 檔案中的少數設定鍵中受支援,例如終端 cwdenvshellshellArgs 值。某些設定,如 window.title,有自己的變數。

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

請參閱設定編輯器中的註釋(⌘, (Windows, Linux Ctrl+,))以瞭解特定於設定的變數。

為什麼沒有文件說明 ${workspaceRoot}?

變數 ${workspaceRoot} 已棄用,取而代之的是 ${workspaceFolder},以便更好地與多根工作區支援保持一致。

為什麼 tasks.json 中的變數未解析?

tasks.json 中並非所有值都支援變數替換。具體來說,只有 commandargsoptions 支援變數替換。inputs 部分中的輸入變數將不會解析,因為不支援輸入變數的巢狀。

如何知道變數的實際值?

檢查變數執行時值的一種簡單方法是建立一個 VS Code 任務,將變數值輸出到控制檯。例如,要檢視 ${workspaceFolder} 的已解析值,您可以在 tasks.json 中建立並執行(終端 > 執行任務)以下簡單的“echo”任務:

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