建立自定義專案模板

Venyoooo發表於2022-01-04

建立一個整合了所有自己常用元件的專案模板,能夠在新專案啟動時節省大量的時間。.net對自建專案模板支援還是比較友好的,但問題是文件不多,我查到的文件裡面較少比較詳細的就只有這篇部落格。接下來,我會按照步驟重新建立一個模板來解釋模板檔案的配置。

  1. 建立一個控制檯專案(也可以是其他型別的專案)

    dotnet new console -n TestTemplate
    
  2. 在專案根目錄下建立 .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 引數
  3. 修改專案內容,此處僅在 Program.cs 檔案中加入 TestTemplate,用於測試效果

     // See https://aka.ms/new-console-template for more information
     Console.WriteLine("TestTemplate");
    
  4. 安裝本地專案模板

     >dotnet new --install.
    
     將安裝以下模板包:
     D:\code\test\TestTemplate
    
     成功: D:\code\test\TestTemplate 已安裝以下模板:
     模板名   短名稱   語言  標記
     ----  ----  --  -------
     Base  base      Web/MVC
    
  5. 使用自定義模板建立專案

     >dotnet new base -n TestProject
    
     已成功建立模板“Base”。
    

    開啟 TestProject 專案可以看到專案配置檔名變更為 TestProject.csproj,Program.cs 檔案內容變更為

     // See https://aka.ms/new-console-template for more information
     Console.WriteLine("TestProject");
    
  6. 排除部分檔案、目錄,在專案模板開發過程中,難免會自動生成一些檔案,比如 .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"
                         ]
                     }
                 ]
             }
         ]
     }
    
  7. 新增可選模組,此處以 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/**"
                         ]
                     }
                 ]
             }
         ]
     }
    
  8. 生成帶有 json 模組的專案

     dotnet new base -n TestProject
    
     生成專案結構如下:
     TestProject
     │  Program.cs
     │  TestProject.csproj
     │
     └─Json
             JsonHelper.cs
    
  9. 生成不帶有 json 模組的專案

    dotnet new base -n TestProject --json false
    
    生成專案結構如下:
    TestProject
        Program.cs
        TestProject.csproj
    
    沒有子資料夾
    

以上為我自己常用的模板配置,其他還有一些可配置項,感興趣的讀者可以查閱官方文件或者檢視官方demo。歡迎聯絡討論:venyowong@163.com。

相關文章