作者用的 .NET 範本

作為範本作者,你會建立 .NET 範本——從預設結構產生專案、檔案或其他資源的藍圖。 當使用者執行 dotnet new <shortName>時,.NET 範本引擎會讀取範本並在目前目錄中產生輸出。 Visual Studio 的「建立新專案」對話框也使用 .NET 範本引擎來製作 .NET 專案範本,所以你為 CLI 撰寫的範本也能在 Visual Studio 中運作。

.NET SDK 內建了常見起始點的範本,如主控台應用程式、類別函式庫和 ASP.NET 專案。 除了這些內建範本外,你還可以自行撰寫範本並以 NuGet 套件形式發佈。

本文為範本作者參考資料。 它涵蓋了範本的結構、配置與分布方式。 有關建立與打包範本的逐步說明,請參閱 相關內容 章節。

範本類型

.NET 範本引擎支援三種範本:項目範本、專案範本與解決方案範本。

  • 項目範本會 產生一個或多個檔案,例如程式碼檔案、設定檔或其他資源,而不必圍繞它們產生整個專案。 例如,項目範本可能會產生一個類別檔案,新增一組擴充方法,或是遵循團隊標準版面配置的 JSON 設定檔。 想了解如何製作物品範本,請參閱 教學:建立物品範本

  • Project 範本會產生完整的 project 結構。 內建的主控台專案範本,例如會產生一個 .csproj 檔案、一個 Program.cs 檔案,以及構成該專案的其他檔案。 當你想給使用者完整的專案起點,而不是單一檔案時,可以撰寫專案範本。 想了解如何建立專案範本,請參閱 教學:建立專案範本

  • 解決方案範本會 產生包含一個或多個專案的解決方案。 例如,解決方案範本可以在單一步驟內建立與測試專案的 API 專案。

當你建立自己的範本時,你會用 tags.type 設定檔中的 template.json 欄位宣告它的型別。 有效值為 "project""item""solution"。 這些值讓使用者在搜尋帶有或 dotnet new searchdotnet new list的範本時可以篩選結果。

小提示

Project 和解決方案範本會出現在 Visual Studio 的「建立新 project」對話框中,但「新增>項目」對話框中不會有項目範本。 使用者可從 dotnet new CLI 存取項目範本。

範本結構

範本是磁碟上的一個資料夾,裡面包含兩個東西:範本原始檔案和一個特殊的 .template.config 子資料夾。 當使用者執行 dotnet new <shortName>時,範本引擎會將原始檔案複製到輸出位置,並套用你為範本設定的任何設定。

mytemplate/
├── console.cs
├── readme.txt
└── .template.config/
    ├── template.json
    └── icon.png

來源檔案可以是任何類型的檔案。 模板引擎不需要你在原始碼中注入特殊標記或標記。 它使用檔案 as-is,這表示你可以像一般 .NET 專案一樣建立、執行和除錯範本的原始專案。 要將現有專案轉成範本,請在專案根目錄中新增 .template.config/template.json 一個檔案。

你可以選擇性地將與範本參數(符號)相關的替換標記直接注入範本原始檔案和檔案名稱中。 如果這些權杖不是有效的原始碼,你就無法在將原始專案部署成範本前,先建置、執行或除錯。 這些權杖不會影響使用者從已部署範本建立的專案,因為範本引擎會在專案建立時替換它們。

裡面 .template.config 唯一需要的檔案是 template.json。 這個檔案會告訴範本引擎所需的一切:範本名稱、簡稱、作者、分類,以及使用者在從範本建立時可以傳遞的參數。 你也可以把檔案放 icon.png.template.config 資料夾裡。 終端機不會顯示圖示,但 Visual Studio 會在「建立新專案」對話框中顯示圖示。 128×128 PNG 效果很好。

template.json 檔案

檔案 template.json 是範本中唯一需要的設定。 它存在於資料夾內 .template.config ,告訴範本引擎如何呈現和處理你的範本。 下表說明常見的必填與選填欄位:

Field 類型 為必填項目 Description
$schema URI No 的 JSON 架構 template.json。 設定為 https://json.schemastore.org/template 以啟用像 Visual Studio Code 這類編輯器中的 IntelliSense。
author 字串 No 範本的作者。
classifications array(string) No 使用者可用來尋找帶有 dotnet new searchdotnet new list的模板標籤。 這些值會出現在範本清單的 標籤 欄位。
description 字串 No 範本所創造的描述。
identity 字串 Yes 模板的唯一識別碼。
name 字串 Yes 範本的顯示名稱會顯示給使用者。
shortName 字串 Yes 使用者傳遞給 的 dotnet new 短名稱,從範本中建立,例如 consoleclasslib或 。
sourceName 字串 No 你來源檔案和檔名中的一個字串,範本引擎會替換成使用者透過 or --name提供的-n名稱。 如果使用者沒有提供名稱,引擎就會使用目前的目錄名稱。
preferNameDirectory boolean No 當 和 使用者提供名稱但未輸出目錄時 true ,範本引擎會建立一個帶有該名稱的新目錄,而非將檔案寫入目前目錄。 預設值為 false
tags 物件 No 識別屬性的元資料,例如範本語言與類型。 語言 和 tags.typeprojecttags.languageitem、 或 solution

有兩個領域值得特別關注。 這個 sourceName 欄位是模板處理命名的方式:將它設為出現在檔案名稱和原始碼中的字串(例如 MyTemplate),範本引擎會將每次出現的名稱替換成使用者建立範本時傳入的名稱。 欄位控制 classifications 可搜尋性;選擇能準確描述範本用途的標籤,讓使用者在搜尋時能找到。

這裡有一個主機模板的最小 template.json 要求:

{
  "$schema": "https://json.schemastore.org/template",
  "author": "Your Name",
  "classifications": [ "Common", "Console" ],
  "description": "Creates a console application.",
  "identity": "MyCompany.ConsoleTemplate.CSharp",
  "name": "My Console App",
  "shortName": "myconsole",
  "sourceName": "MyConsoleApp",
  "tags": {
    "language": "C#",
    "type": "project"
  }
}

完整架構可在 JSON Schema Store 取得。 關於進階設定選項,如條件式檔案包含、後期建立動作和多專案範本,請參閱 dotnet/templateting GitHub 維基

範本參數(符號)

template.json區段symbols定義使用者在從範本建立時可以傳遞的參數。 每個符號都會變成 上的 dotnet new <shortName>CLI 選項,因此一個名為 ClassName 的符號變成 --ClassName (或 -C 如果你定義一個短名稱)。

每個符號項目支援以下常見設定:

Setting Description
type 必須是 "parameter" 針對使用者的參數。
description 使用者執行 dotnet new <shortName> -?. 時,範本說明輸出中顯示。
datatype 期望資料型態,例如 "text""bool"、 或 "choice"
replaces 你來源檔案中的一個字串,範本引擎會用參數值替換它。
fileRename 你來源檔案中的一個字串名稱,範本引擎會用參數值替換它。
defaultValue 當使用者未提供參數時所使用的值。

replacesfileRename設定是符號驅動替代的方式。 當使用者提供值時,範本引擎會替換該字串在檔案內容中的每 replaces 一次出現,以及該字串在檔案名稱中的每一次 fileRename 出現。 如果使用者沒有提供值,則會用 來 defaultValue 代替。

例如,以下符號讓使用者在從範本建立時設定類別名稱。 檔案會被重新命名,並更新其內的類別以符合:

"symbols": {
  "ClassName": {
    "type": "parameter",
    "description": "The name of the code file and class.",
    "datatype": "text",
    "replaces": "StringExtensions",
    "fileRename": "StringExtensions",
    "defaultValue": "StringExtensions"
  }
}

定義此符號後,使用者可執行dotnet new <shortName> --ClassName MyHelpers以產生包含名為 MyHelpers的類別的檔案MyHelpers.cs。 若無該旗標,檔案與類別仍保留預設名稱 StringExtensions

為了驗證範本暴露的參數,安裝後傳送 -? 到它的簡稱:

dotnet new <shortName> -?

範本套件

範本套件是一個 NuGet (.nupkg) 檔案,將一個或多個範本打包在一起。 當使用者安裝你的範本套件時,.NET 範本引擎會一次註冊裡面的所有範本。 套件是發佈範本的標準方式。 只要發佈一個套件到 NuGet.org 或私人 NuGet 訂閱源,或分享本地 .nupkg 檔案,使用者只需一個指令就能取得整個集合。

要建立範本套件,請使用一個 C# 專案檔案(.csproj),並將其設定為 打包專案 ,而非編譯專案。 使此方法運作的關鍵設定包括:

Setting 價值 Purpose
PackageType Template 會把套件標記為範本套件,這樣它才會出現在 dotnet new search 結果裡。
IncludeContentInPack true 包含 NuGet 套件中的內容檔案。
IncludeBuildOutput false 防止編譯後的二進位檔被加入套件中。
ContentTargetFolders content 把你的範本資料夾放在 content NuGet 套件的資料夾裡,這也是範本引擎預期會找到它們的地方。

templatepack專案範本提供了建立包裝專案最簡單的方法:

  1. 安裝 Microsoft。TemplateEngine.Authoring.Templates NuGet 套件:

    dotnet new install Microsoft.TemplateEngine.Authoring.Templates
    
  2. 建立包裝專案:

    dotnet new templatepack -n <PackageName>
    

生成的專案包含正確的 .csproj 設定、 content 一個範本資料夾,以及用於範本驗證和可選本地化的 MSBuild 任務。

關於建立、打包及發佈範本套件的完整流程,請參見 教學:建立範本套件

在本地測試你的範本

在範本開發時,直接從資料夾安裝範本,這樣可以測試,不用先建立套件。 將路徑傳遞到包含該 .template.config 資料夾的目錄:

dotnet new install ./mytemplate/

要查看所有已安裝的範本套件以及每個套件的精確卸載指令,請執行 dotnet new uninstall 時不要輸入參數:

dotnet new uninstall

要從目錄中卸載模板,請傳遞你安裝時使用的相同目錄路徑:

dotnet new uninstall ./mytemplate/

當你準備好分享範本時,打包成 NuGet 套件(參見 範本套件),並分發。 使用者安裝您已發佈的範本時,會包含 dotnet new install 以下其中一個原始參數:

  • 一個 NuGet 套件 ID,從目前目錄中設定的 NuGet 來源安裝最新的穩定版本:

    dotnet new install AdatumCorporation.ConsoleTemplate.CSharp
    
  • 一個帶有自訂訂閱源 URL 的 NuGet 套件 ID。 該 --nuget-source 選項除了已設定的 NuGet 原始碼外,僅用於該安裝:

    dotnet new install AdatumCorporation.ConsoleTemplate.CSharp --nuget-source https://mynugetfeed.example.com/v3/index.json
    
  • 一個通往本地 .nupkg 檔案的路徑:

    dotnet new install ./AdatumCorporation.ConsoleTemplate.CSharp.1.0.0.nupkg
    

Warning

範本可以在專案建立時執行 MSBuild 任務和任意程式碼。 只安裝你信任來源的範本。

若要卸載從 NuGet 來源或本地 .nupkg 檔案安裝的套件,請使用 NuGet 套件 ID:

dotnet new uninstall AdatumCorporation.ConsoleTemplate.CSharp

內建的 SDK 範本不會出現在卸載清單中,也無法用 dotnet new uninstall.

模板本地化

.NET 範本引擎支援可選的範本元資料本地化。 當你提供本地化檔案時,像 和 的主機,例如 dotnet new 和 Visual Studio 的新 Project 對話框會以使用者語言顯示範本名稱、描述和符號資訊,而非原始作者語言。

以下範本欄位支援本地化:

  • name
  • author
  • description
  • 符號 descriptiondisplayName
  • 選擇參數中每個選擇的描述與顯示名稱
  • description 後及 manualInstructions

要新增本地化,請在裡面.template.config建立localize一個子資料夾,並為每種語言新增一個 JSON 檔案。 為每個檔案 templatestrings.<lang-code>.json命名 ,其中 <lang-code> 與 匹配的有效 CultureInfo 名稱,例如 pt-BRzh-Hansde。 每個檔案包含鍵值對,其中鍵是指向元素 template.json的路徑,作為 / 巢狀欄位的分隔符。

例如,給定一個 template.json 內容如下:

{
  "$schema": "https://json.schemastore.org/template",
  "author": "Microsoft",
  "classifications": [ "Config" ],
  "name": "EditorConfig file",
  "description": "Creates an .editorconfig file for configuring code style preferences.",
  "symbols": {
    "Empty": {
      "type": "parameter",
      "datatype": "bool",
      "defaultValue": "false",
      "displayName": "Empty",
      "description": "Creates empty .editorconfig instead of the defaults for .NET."
    }
  }
}

一個巴西葡萄牙語本地化檔案的名稱 templatestrings.pt-BR.json 會是這樣的:

{
  "author": "Microsoft",
  "name": "Arquivo EditorConfig",
  "description": "Cria um arquivo .editorconfig para configurar as preferências de estilo de código.",
  "symbols/Empty/displayName": "Vazio",
  "symbols/Empty/description": "Cria .editorconfig vazio em vez dos padrões para .NET."
}

範本引擎在載入範本資訊時會解析這些檔案,並根據當前 UI 文化自動回傳本地化值——使用者無需額外步驟。

本地化是可選的。 如果你沒有包含本地化檔案,範本會正常運作,並且總是顯示來自 template.json的值。 更多資訊請參考 dotnet/templateing wiki 的本地化頁面

Visual Studio 整合功能

Visual Studio 的「建立新專案」對話框使用 .NET 範本引擎來製作 .NET 專案範本。 也可以在 Visual Studio 裡為工作編寫dotnet new範本,不需要額外設定。 當使用者安裝你的範本套件時dotnet new install,Visual Studio 會自動偵測並顯示這些範本在對話框中。

Project 和解決方案範本會出現在「建立新 project」對話框中,與內建的 SDK 範本並列。 使用者可以依範本檔案中的欄位template.json中名稱、語言classifications或標籤來查找範本。 準確的分類有助於你的範本出現在正確的篩選類別中,因此請謹慎選擇。 為了讓你的範本在對話框中看起來更精緻,可以在資料夾裡新增 an icon.png.template.config — Visual Studio 會把它顯示在範本名稱旁邊。

物品範本 目前不會出現在 新增>物品 對話框中。 使用者仍可在終端機中使用該 dotnet new 指令的項目範本。

為了讓你的範本能被尚未安裝的Visual Studio用戶發現,請將你的範本套件發佈給 nuget.org。「建立新專案」對話框包含「從線上搜尋中安裝更多範本」選項,該選項可搜尋 nuget.org 範本套件。 當使用者透過該選項安裝你的套件時,Visual Studio 會使用與 dotnet new install. 相同的安裝機制。

如需更深入的 Visual Studio 專屬整合指引,例如控制範本排序順序及設定更多 IDE 專屬選項,請參閱 Sayed Hashimi 的範本範例庫