變數參考
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 處理程序清單中選取單一處理程序。命令會傳回選取處理程序的處理程序識別碼。這使得可以在依處理程序識別碼附加啟動組態中使用 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:如果使用者未輸入其他內容,將使用的預設值。它必須是選項值之一。
選項可以是字串值或具有標籤和值的物件。下拉式選單將顯示 標籤: 值。
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"
}
]
}
執行範例
下列範例示範如何在偵錯組態中使用 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
檔案中的選定設定索引鍵中受支援,例如終端機 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
中建立並執行 (終端機 > 執行工作) 以下簡單的 'echo' 工作
{
"version": "2.0.0",
"tasks": [
{
"label": "echo",
"type": "shell",
"command": "echo ${workspaceFolder}"
}
]
}