變數引用
Visual Studio Code 在 除錯 和 任務 配置檔案中以及一些選定的設定中支援變數替換。透過使用 ${variableName} 語法,可以在 launch.json 和 tasks.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} 的簡寫 |
預定義變數示例
假設您有以下條件
- 編輯器中打開了一個位於
/home/your-username/your-project/folder/file.ext的檔案; - 目錄
/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.json 和 launch.json 的字串值中使用 IntelliSense 以獲取預定義變數的完整列表。
每個工作區資料夾的變數作用域
透過在變數後面附加根資料夾的名稱(用冒號分隔),可以訪問工作區的同級根資料夾。如果省略根資料夾名稱,則變數的作用域與使用它的資料夾相同。
例如,在具有 Server 和 Client 資料夾的多根工作區中,${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.json 和 tasks.json 的 inputs 部分中的條目,其中指定了其他配置屬性。不支援輸入變數的巢狀。
以下示例顯示了一個使用輸入變數的 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:如果使用者未輸入其他內容,將使用的預設值。它必須是選項值之一。
選項可以是字串值,也可以是包含標籤和值的物件。下拉選單將顯示 label: value。
command:
- command:在變數插值時執行命令。
- args:傳遞給命令實現的可選引數包。
下面是一個 tasks.json 示例,說明了如何使用 inputs 以及 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"
}
]
}
執行示例

以下示例展示瞭如何在除錯配置中使用使用者輸入變數,該配置允許使用者從特定資料夾中找到的所有測試用例列表中選擇一個測試用例。假設某個擴充套件提供了 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 的值。像 window.title 這樣的設定有自己的變數
"window.title": "${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}"
請參閱設定編輯器中的註釋(⌘, (Windows, Linux Ctrl+,))以瞭解特定於設定的變數。
為什麼 ${workspaceRoot} 沒有被記錄?
變數 ${workspaceRoot} 已被棄用,取而代之的是 ${workspaceFolder},以便更好地與 多根工作區 支援保持一致。
為什麼 tasks.json 中的變數沒有被解析?
tasks.json 中的並非所有值都支援變數替換。具體來說,只有 command、args 和 options 支援變數替換。inputs 部分中的輸入變數將不會被解析,因為不支援輸入變數的巢狀。
如何知道變數的實際值?
檢查變數執行時值的一個簡單方法是建立一個 VS Code 任務,將變數值輸出到控制檯。例如,要檢視 ${workspaceFolder} 的解析值,您可以在 tasks.json 中建立並執行(Terminal > Run Task)以下簡單的“echo”任務
{
"version": "2.0.0",
"tasks": [
{
"label": "echo",
"type": "shell",
"command": "echo ${workspaceFolder}"
}
]
}