建立一個整合了所有自己常用元件的專案模板,能夠在新專案啟動時節省大量的時間。.net對自建專案模板支援還是比較友好的,但問題是文件不多,我查到的文件裡面較少比較詳細的就只有這篇部落格。接下來,我會按照步驟重新建立一個模板來解釋模板檔案的配置。
-
建立一個控制檯專案(也可以是其他型別的專案)
dotnet new console -n TestTemplate
-
在專案根目錄下建立 .template.config 目錄,並在該目錄下建立 template.json 檔案
{ "$schema": "http://json.schemastore.org/template", "author": "Venyo Wong", "classifications": [ "Web", "MVC" ], "identity": "Base", "name": "Base", "shortName": "base", "preferNameDirectory": true, "symbols": { "name": { "type": "parameter", "replaces": "TestTemplate", "FileRename": "TestTemplate", "isRequired": true } } }
這樣就建立好了一個最基礎的專案模板。
- classifications 欄位代表該模板的型別,會在 dotnet new 的模板列表體現出來
- identity、name、shortName 是用來識別模板的欄位
- preferNameDirectory 該欄位表示是否將目錄名稱作為專案名稱,比如該欄位設定為 true,在一個名為 Test 的目錄下建立專案,在未指定專案名稱的前提下,專案名稱預設為 Test
- symbols 代表建立專案時可以指定的引數
- symbols.name 表示使用此模板建立專案時可以指定 name 引數
- symbols.name.replaces: "TestTemplate" 表示在建立專案時,需要把檔案中的 TestTemplate 字串替換為使用者傳入的 name 引數
- symbols.name.FileRename: "TestTemplate" 表示在建立專案時,需要把檔名中的 TestTemplate 字串替換為使用者傳入的 name 引數
-
修改專案內容,此處僅在 Program.cs 檔案中加入 TestTemplate,用於測試效果
// See https://aka.ms/new-console-template for more information Console.WriteLine("TestTemplate");
-
安裝本地專案模板
>dotnet new --install. 將安裝以下模板包: D:\code\test\TestTemplate 成功: D:\code\test\TestTemplate 已安裝以下模板: 模板名 短名稱 語言 標記 ---- ---- -- ------- Base base Web/MVC
-
使用自定義模板建立專案
>dotnet new base -n TestProject 已成功建立模板“Base”。
開啟 TestProject 專案可以看到專案配置檔名變更為 TestProject.csproj,Program.cs 檔案內容變更為
// See https://aka.ms/new-console-template for more information Console.WriteLine("TestProject");
-
排除部分檔案、目錄,在專案模板開發過程中,難免會自動生成一些檔案,比如 .vs、.vscode 等,想要將這些檔案、目錄排除在模板之外,需要做額外的配置。
{ "$schema": "http://json.schemastore.org/template", "author": "Venyo Wong", "classifications": [ "Web", "MVC" ], "identity": "Base", "name": "Base", "shortName": "base", "preferNameDirectory": true, "symbols": { "name": { "type": "parameter", "replaces": "TestTemplate", "FileRename": "TestTemplate", "isRequired": true } }, "sources": [ { "modifiers": [ { "exclude": [ ".template.config/**", ".vs/**", ".vscode/**", "bin/**", "log/**", "obj/**", "ProjectTemplate.xml" ] } ] } ] }
-
新增可選模組,此處以 Newtonsoft.Json 為例進行說明。
專案配置引用 Newtonsoft.Json 包。
<ItemGroup Condition="$(json)"> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> </ItemGroup>
在專案根目錄新增 Json 目錄,並且新增 JsonHelper.cs 檔案,內容如下:
using Newtonsoft.Json; namespace TestTemplate.Json; public static class JsonHelper { public static (string, Exception?) ToJson(this object obj) { if (obj == null) { return default; } try { return (JsonConvert.SerializeObject(obj), null); } catch (Exception ex) { return (string.Empty, ex); } } }
Program.cs 檔案修改為:
// See https://aka.ms/new-console-template for more information #if (!json) Console.WriteLine("TestTemplate"); #else using TestTemplate.Json; Console.WriteLine(JsonHelper.ToJson(new { Key = "Value" })); #endif
最後修改 template.json 配置如下:
{ "$schema": "http://json.schemastore.org/template", "author": "Venyo Wong", "classifications": [ "Web", "MVC" ], "identity": "Base", "name": "Base", "shortName": "base", "preferNameDirectory": true, "symbols": { "name": { "type": "parameter", "replaces": "TestTemplate", "FileRename": "TestTemplate", "isRequired": true }, "json": { "type": "parameter", "dataType":"bool", "defaultValue": "true" } }, "sources": [ { "modifiers": [ { "exclude": [ ".template.config/**/*", ".vs/**", ".vscode/**", "bin/**", "log/**", "obj/**", "ProjectTemplate.xml" ] }, { "condition": "(!json)", "exclude": [ "Json/**" ] } ] } ] }
-
生成帶有 json 模組的專案
dotnet new base -n TestProject 生成專案結構如下: TestProject │ Program.cs │ TestProject.csproj │ └─Json JsonHelper.cs
-
生成不帶有 json 模組的專案
dotnet new base -n TestProject --json false 生成專案結構如下: TestProject Program.cs TestProject.csproj 沒有子資料夾
以上為我自己常用的模板配置,其他還有一些可配置項,感興趣的讀者可以查閱官方文件或者檢視官方demo。歡迎聯絡討論:venyowong@163.com。