共用方式為


針對「開啟資料夾」建立建置及偵錯工作

Visual Studio 可以自動執行多種不同的程式語言和程式碼基底。 「開啟資料夾」選項可讓您立即執行被識別程式碼基底中的程式碼,無需特別指示或建立專案。 開發人員通常會使用這種方法進行快速測試。

有些程式碼基底需要自訂建置工具,而 Visual Studio 可能無法識別或無法立即使用「開啟資料夾」選項處理這些工具。 對於這些情境,您可以定義建置工作來指示 Visual Studio 如何建置和偵錯程式碼。 建置工作指定了語言建置和執行程式碼所需的所有項目,並且可以用來完成幾乎任何所需的操作。

本文說明了如何定義建置工作,以便在 Visual Studio 中為無法辨識、無專案的程式碼基底配置建置和偵錯設定。

探索 JSON 設定檔

為了自訂無專案的程式碼基底,Visual Studio 提供了兩個 JSON (.json) 檔案來設定配置:taskslaunch。 當您在 Visual Studio 方案總管中選擇特定選項時,Visual Studio 會視需要建立 (或打開) 這些檔案。

下表描述了 JSON 檔案及其在方案總管中建立的方法。

JSON 檔案 設定用途 檔案存取
tasks.vs.json 定義自訂建置命令、自訂編譯器參數,以及任意 (非建置相關) 工作。 方案總管中,以右鍵按一下檔案或資料夾以打開內容選單,然後選擇「設定工作」
launch.vs.json 針對偵錯指定命令列引數。 方案總管中,以右鍵按一下檔案或資料夾以打開內容選單,然後選擇「新增偵錯設定」

將 JSON 檔案新增至原始檔控制

預設情況下,taskslaunch JSON 檔案在方案總管中不可見。 這些檔案都是位於您程式碼基底之根目錄 (\) 資料夾中名為 .vs 的隱藏資料夾內。 這些檔案處於隱藏狀態是因為它們通常不會被新增到原始檔控制中。 您可以透過在方案總管中選擇「顯示所有檔案」選項來查看 Visual Studio 中的隱藏檔案。

如果您想將 JSON 檔案新增至原始檔控制,請將檔案拖曳至檔案系統中的程式碼基底根目錄 (\) 資料夾。 檔案會在方案總管中顯示出來,並且可供原始檔控制使用。

以 tasks.vs.json 定義工作

您可以針對您目前在工作區中所擁有的檔案自動化建置指令碼和其他外部作業,方法是直接在 Visual Studio 中以工作的形式執行這些動作。 若要設定新的工作,請在方案總管中以右鍵點擊檔案或資料夾,然後選擇「設定工作」

此螢幕擷取畫面顯示如何設定工作,以自動化建置指令碼,和對「方案總管」中的檔案進行外部操作。

這個動作會在 .vs 資料夾中建立 (或打開) tasks.vs.json 檔案。 您可以在此檔案中定義建置工作或任意工作,然後 Visual Studio 會將該工作名稱新增為方案總管右鍵功能表中的命令。 您可以透過在方案總管中選擇相應的命令來執行該工作。

您可以將自訂工作新增到個別檔案中,也可以新增到特定類型的所有檔案中。 例如,您可以將 NuGet 套件檔案設定成包含「還原套件」工作,或是將所有原始程式檔設定成包含靜態分析工作,例如針對所有 JavaScript .js) 檔案提供 Linter。

為無法辨識的工具建立工作

如果您的程式碼基底使用 Visual Studio 無法辨識的自訂組建工具,則在您完成額外設定步驟前,將無法在 Visual Studio 中執行程式碼並對它進行偵錯。

您可以定義建置工作來指示 Visual Studio 如何建置、重建和清理您的程式碼。 tasks.vs.json 檔案會將 Visual Studio 內部開發流程與您為程式碼基底定義的自訂建置工具結合在一起。

假設您的程式碼基底中有一個名為 hello.cs 的 C# 檔案。 這種程式碼基底的 makefile 可能如下所示:

build: directory hello.exe

hello.exe: hello.cs
    csc -debug hello.cs /out:bin\hello.exe

clean:
    del bin\hello.exe bin\hello.pdb

rebuild: clean build

directory: bin

bin:
    md bin

對於包含建置、清理和重建目標的類似 makefile,您可以使用「設定工作」選項來處理 makefile,並定義以下 tasks.vs.json 檔案。 該 JSON 檔案定義了使用 NMAKE 作為建置工具來建置、重建和清理程式碼基底的工作:

{
  "version": "0.2.1",
  "outDir": "\"${workspaceRoot}\\bin\"",
  "tasks": [
    {
      "taskName": "makefile-build",
      "appliesTo": "makefile",
      "type": "launch",
      "contextType": "build",
      "command": "nmake",
      "args": [ "build" ],
      "envVars": {
        "VSCMD_START_DIR": "\"${workspaceRoot}\""
      }
    },
    {
      "taskName": "makefile-clean",
      "appliesTo": "makefile",
      "type": "launch",
      "contextType": "clean",
      "command": "nmake",
      "args": [ "clean" ],
      "envVars": {
        "VSCMD_START_DIR": "\"${workspaceRoot}\""
      }
    },
    {
      "taskName": "makefile-rebuild",
      "appliesTo": "makefile",
      "type": "launch",
      "contextType": "rebuild",
      "command": "nmake",
      "args": [ "rebuild" ],
      "envVars": {
        "VSCMD_START_DIR": "\"${workspaceRoot}\""
      }
    }
  ]
}

tasks.vs.json 檔案中定義建置工作後,Visual Studio 會將相應的工作命令新增至方案總管的右鍵功能表中。 在這個範例中,建置重建清理選項會被新增至程式碼基底中 makefile 執行個體的右鍵選單。

此螢幕擷取畫面顯示了在方案總管中,將 makefile 的建置、重建和清理工作選項新增到右鍵功能表。

Visual Studio 會根據其 contextType 設定在「設定工作」命令之後,於右鍵功能表中列出新的命令。 「build」、「rebuild」和「clean」是建置命令,會列在右鍵功能表的「建置」區段中。

當您在右鍵功能表中選擇自訂工作命令時,該操作就會執行。 Visual Studio 會在輸出視窗中顯示命令輸出,並在錯誤清單中顯示所有建置錯誤。

為任意作業建立工作

您可以在 tasks.vs.json 檔案中定義自訂工作來執行任何任意作業。 您可以定義工作以顯示目前在「輸出」視窗中已選取之檔案的名稱,或是列出指定資料夾中的檔案。

範例:顯示目前所選取檔案的名稱

下列範例示範定義單一任意工作的 tasks.vs.json 檔案。 當您執行這個作業時,該作業會顯示目前所選取 JavaScript (.js) 檔案的檔案名稱。

{
  "version": "0.2.1",
  "tasks": [
    {
      "taskName": "Echo filename",
      "appliesTo": "*.js",
      "type": "default",
      "command": "${env.COMSPEC}",
      "args": [ "echo ${file}" ]
    }
  ]
}

這個工作的程式碼定義了以下屬性:

  • taskName:Visual Studio 在右鍵功能表中顯示的工作命令名稱。 在此案例中是 Echo 檔案名稱
  • appliesTo:工作命令要作用的檔案。 在此案例中,是 JavaScript (.js) 檔案。
  • command:要叫用的命令。 此案例使用 COMSPEC 環境變數會用來識別命令列解譯器 (通常為 cmd.exe)。
  • args:當 Visual Studio 叫用命令時要傳遞的任何參數。
  • ${file}:這個工作的參數包括一個巨集,用於檢索目前在方案總管中選擇的檔案。

儲存 tasks.vs.json 檔案後,您可以右鍵點擊資料夾中的任何 JavaScript (.js) 檔案,然後選擇「Echo 檔案名稱」。 Visual Studio 會在輸出視窗中顯示選擇的檔案名稱。

範例:列出檔案和子資料夾

以下範例顯示了 tasks.vs.json 檔案,該檔案定義了一個工作,用於列出 bin 資料夾中的檔案和子資料夾:

{
  "version": "0.2.1",
  "outDir": "\"${workspaceRoot}\\bin\"",
  "tasks": [
    {
      "taskName": "List Outputs",
      "appliesTo": "*",
      "type": "default",
      "command": "${env.COMSPEC}",
      "args": [ "dir ${outDir}" ]
    }
  ]
}

這個工作的程式碼定義了以下屬性:

  • taskName:右鍵功能表中的工作命令名稱「列出輸出」
  • appliesTo:這個工作會處理指定資料夾中的所有項目,如使用萬用字元 (*) 所示。
  • command:與前一個範例類似,這個工作使用 COMSPEC 環境變數來識別命令列解譯器 (cmd.exe)。
  • args:當 Visual Studio 叫用這個工作時,它會傳遞一個對 dir 命令的呼叫,該命令會列出目錄 (資料夾) 中的項目。
  • ${outDir}{outDir} 巨集在 tasks 區塊之前定義。 它會將 bin 資料夾識別為要處理的目錄。

這個工作適用於程式碼基底中的所有檔案。 當 Visual Studio 將任意工作的命令名稱新增到右鍵功能表時,它會在命令前加上「執行」,例如「執行列出輸出」

如果您打開方案總管中任何檔案的右鍵功能表,工作命令「執行列出輸出」會顯示在功能表「建置」區段的最後一個命令。 當您選擇「執行列出輸出」時,Visual Studio 會在輸出視窗中列出程式碼基底的 bin 資料夾內容。

此螢幕擷取畫面顯示了在 Visual Studio 方案總管中,將任意工作新增到右鍵功能表。

使用多個 task.vs.json 檔案

您可以在程式碼基底的根目錄 (\) 和子資料夾中擁有多個 tasks.vs.json 檔案。 這種方法可讓您靈活地為程式碼基底中的特定子資料夾或檔案定義不同的行為。

Visual Studio 會彙總或覆寫程式碼基底中的設定,並以下列順序作為檔案的優先順序:

  1. 根目錄 (\) 中的 .vs 資料夾中的設定檔。
  2. 計算設定的資料夾。
  3. 目前資料夾的父資料夾,一直到包括根目錄 (\) 資料夾。
  4. 位於根目錄 (\) 資料夾中的設定檔案。

這些匯總規則僅適用於 tasks.vs.json 檔案的執行個體。

測試 tasks.vs.json 的屬性

以下各節將說明您可以在 tasks.vs.json 檔案中指定的一些屬性。

設定 appliesTo 屬性

您可以透過使用 appliesTo 屬性 (例如 "appliesTo": "hello.js") 指定檔案或資料夾名稱,來為任何檔案或資料夾建立工作。

下表總結了您可以使用 appliesTo 屬性來產生特定工作行為的檔案遮罩值:

值 (檔案遮罩) 工作適用於
"*" 工作區中的所有檔案和資料夾
"*/" 工作區中的所有資料夾
"*.js" 工作區中副檔名為 JavaScript (.js) 的所有檔案
"/*.js" 所有工作區根目錄 (\) 資料夾中具有 JavaScript (.js) 副檔名的檔案
"src/*/" src 資料夾的所有子資料夾
"makefile" 工作區中所有名為 makefile 的檔案
"/makefile" 僅在工作區根目錄 (\) 資料夾中名為 makefile 的檔案

在工作引數中使用巨集

您可以將巨集作為工作的引數傳遞,以在 Visual Studio 叫用命令時增強工作行為。

下表列出幾個巨集範例:

Macro 描述 範例
${env.<VARIABLE>} 指定開發人員命令提示字元中可用的任何環境變數。 如需詳細資訊,請參閱開發人員命令提示字元和開發人員 PowerShell %
${workspaceRoot} 提供工作區資料夾的完整路徑。 %
${file} 提供檔案或資料夾的完整路徑。 %
${relativeFile} 提供檔案或資料夾的相對路徑。 %
${fileBasename} 提供檔案的名稱,不包括路徑或副檔名。 %
${fileDirname} 提供檔案的完整路徑,不包括檔案名稱。 %
${fileExtname} 提供所選檔案的副檔名。 .js  },

搭配 launch.vs.json 設定偵錯

Visual Studio 提供了 launch.vs.json 檔案,可用於設定程式碼基底的偵錯。

注意

若要設定 CMake 專案以進行偵錯,請參閱設定 CMake 偵錯工作階段

  1. 方案總管中,以右鍵點擊可執行 (.exe) 檔案並選擇「新增偵錯設定」

    此螢幕擷取畫面顯示如何在「方案總管」的右鍵功能表上選擇「新增偵錯設定」選項。

  2. 「選擇偵錯工具」對話方塊中,從清單中選擇偵錯設定選項,然後選擇「選取」

    此螢幕擷取畫面顯示如何在「方案總管」中為啟動設定選取偵錯工具。

    如果 launch.vs.json 檔案尚不存在,Visual Studio 將會建立該檔案。 以下是為 hello.exe 可執行檔建立的檔案範例:

    {
      "version": "0.2.1",
      "defaults": {},
      "configurations": [
        {
          "type": "default",
          "project": "bin\\hello.exe",
          "projectTarget": "",
          "name": "hello.exe"
        }
      ]
    }
    
  3. 取得啟動檔案後,在方案總管」中右鍵點擊程式碼基底的可執行檔案,然後選擇「設定為啟動項目」

    系統會將該可執行檔指定為程式碼基底的啟動項目,Visual Studio 設定偵錯「開始」按鈕的標籤以反映可執行檔的名稱:

    此擷取畫面顯示 Visual Studio 中啟動動作的自訂標籤。

    當您使用 F5 啟動偵錯工具時,Visual Studio 開始偵錯您的程式碼並在任何設定的中斷點處停止。 所有您熟悉的偵錯工具視窗都會可供使用並運作。

    如需在 C++ 開啟資料夾專案中自訂組建和偵錯工作的更多資訊,請參閱在 Visual Studio 中開啟 C++ 組建系統的資料夾支援

指定偵錯的引數

您可以在 launch.vs.json 檔案中指定要針對偵錯傳入的命令列引數。 在 args 陣列中新增引數,如下列範例所示:

{
  "version": "0.2.1",
  "defaults": {},
  "configurations": [
    {
      "type": "default",
      "project": "bin\\hello.exe",
      "name": "hello.exe"
    },
    {
      "type": "default",
      "project": "bin\\hello.exe",
      "name": "hello.exe a1",
      "args": [ "a1" ]
    }
  ]
}

啟動偵錯設定

您可以視需要建立數量不限的偵錯設定。 儲存啟動檔案時,設定名稱將會新增到偵錯目標下拉式清單中。 您可以選擇特定目標來啟動偵錯工具:

此擷取畫面顯示 Visual Studio 方案總管的偵錯目標下拉式清單中的可用設定。

如果您在功能表上沒有看到額外的目標,請選擇「顯示/隱藏偵錯目標」並設定可見目標。

了解設定的優先順序

Visual Studio 會掃描兩個位置,以尋找 launch.vs.json 檔案中 configurations 陣列屬性指定的項目:

  • 程式碼基底的根 (\) 資料夾
  • .vs 資料夾

如果兩個位置都有 launch.vs.json 檔案,且設定的定義有衝突,則 .vs\launch.vs.json 檔案中的值優先。

使用其他設定檔案

除了 tasklaunch JSON 檔案之外,Visual Studio 也會從程式碼基底中定義的其他設定檔中讀取設定。 兩個常用的檔案包括 settings.json.gitignore

使用 .vscode\settings.json 定義程式碼設定

Visual Studio 會從名為 settings.json 的檔案讀取有限的設定 (若檔案位於名為 .vscode 的目錄中)。

此功能是為先前在 Visual Studio Code 中開發的程式碼基底提供的。 目前,從 .vscode\settings.json 檔案讀取的唯一設定是 files.exclude。 此設定用於在方案總管和某些搜尋工具中,以視覺化方式篩選檔案。

您的程式碼基底中可以有多個 .vscode\settings.json 檔案。 從此檔案所讀取的設定,將會套用至 .vscode 的父資料夾及其所有子資料夾。

使用 .gitignore 設定 Git 檔案

您可以使用 .gitignore 檔案,讓 Git 知道應用程式原始檔控制時要忽略哪些檔案。 .gitignore 檔案通常會包含為程式碼基底的一部分,使該設定可與程式碼基底的所有開發人員共用。 Visual Studio 會讀取 .gitignore 檔案中的模式來以視覺方式篩選檔案,以及篩選來自某些搜尋工具的檔案。

讀取自 .gitignore 檔案的設定會套用至其父資料夾及所有子資料夾。