天天看點

.NET Core - 自定義項目模闆

前言:

 前面介紹 自定義項目模闆 中介紹了一種簡單的方式——通過建立項目導出為項目模闆方式實作。本次将采用dotenet cil(手腳架)來建立項目模闆。

 那麼,我們首先看下目前dotnet 支援的項目模闆:

 

.NET Core - 自定義項目模闆

  可以看到目前dotnet中已經提供了很多模闆項目,那麼如何根據項目開發的積累内容通過dotnet cli建立一個自己的項目來提升開發效率呢?

1、實作自定義項目模闆

 自定義模闆項目模闆肯定就需要模闆實作,本次就使用使用之前文章中項目結構作為模闆項目來實作自定義項目模闆

.NET Core - 自定義項目模闆

 接下跟着步驟來建立模闆項目

  • 建立模闆配置檔案

   在項目根檔案夾中建立檔案夾:.template.config  并在目錄下建立 template.json 。如下圖:

   

.NET Core - 自定義項目模闆
  • 定義項目模闆相關資訊

   修改template.json内容為以下内容:

{
    "author": "cwsheng", //必須
    "classifications": [ "Web/WebAPI" ], //必須,這個對應模闆的Tags
    "name": "ApiTmp", //必須,這個對應模闆的Templates
    "identity": "ApiTemplate", //可選,模闆的唯一名稱
    "shortName": "apitmp", //必須,這個對應模闆的Short Name
    "tags": {
      "language": "C#" ,
      "type":"project"
    },
    "sourceName": "ApiTemplate",  // 可選,要替換的名字
    "preferNameDirectory": true  // 可選,添加目錄  
}      

   注意:shortName和sourceName

    • author:模闆作者
    • classifications:模闆特征辨別。上文舉例的配置是因為我自定義的模闆包括了console和webapi。
    • identity:此模闆的唯一名稱
    • name:使用者看到的模闆名稱
    • shortName:短名稱。當使用CLI指令建立模闆項目時,使用短名稱将利于使用。
    • sourceName:模闆替換的關鍵文本,使用時需要注意,要選擇合适的替換文本,不然容易誤傷代碼。
  • 項目模闆安裝

   接下來進入項目目錄,将這個模闆安裝到cli中。使用 

dotnet new -i

  進行模闆的安裝。

dotnew new -i TempDemo      

  

.NET Core - 自定義項目模闆

   解除安裝項目模闆:

dotnet new -u 模闆目錄      
  • 應用項目模闆

   使用指令建立項目:

dotnet new apiTmp -n Test -o .      

apiTmp:是模闆配置檔案中指定的shortName。

-n:指定的是将項目中出現的所有文本

MyJob

替換為

Test

,因為配置中sourceName是ApiTemplate,可按需配置。

-o:指定的是生成項目輸出目錄,上述指令生成項目輸出到目前目錄。

   結果如下圖:    

.NET Core - 自定義項目模闆

  到此通過dotnet cli建立項目模闆已完成,但僅僅這樣完全不能滿足日常工作需求。

  如:A項目需要日志記錄,但B項目不需要日志記錄;A項目需要制定PG資料庫作為存儲方式,B項目需要制定MySQL作為存儲方式。

  那麼這些問題能否在項目建立時根據設定而滿足項目需求呢?

2、模闆項目進階用法

  • 檔案過濾:根據參數過濾制定檔案和代碼内容

   a) 定義參數:在 template.json  中添加以下内容:EnableAuditLog-參數名稱

{
  //……
  "symbols": {
    //是否使用審計日志功能
    "EnableAuditLog": {
      "type": "parameter", //它是參數
      "dataType": "bool", //bool類型的參數
      "defaultValue": "false" //預設是不啟用
    }
  },
  "sources": [
    {
      "modifiers": [
        {
          "condition": "(!EnableAuditLog)", //條件,由EnableAuditLog參數決定
          "exclude": [ //排除下面的檔案
            "AuditLogDemo/Fliters/AuditLogActionFilter.cs"
          ]
        }
      ]
    }
  ]
}      

  b) 取消審計日志生效位置:

.NET Core - 自定義項目模闆

   c) 重新生成模闆,檢視目前模闆支援的參數:

.NET Core - 自定義項目模闆

  d) 建立項目檢查設定是否生效:

.NET Core - 自定義項目模闆
  • 選擇執行:根據變量值選擇程式集引用

   a) 添加參數:DbType指定選項資料庫類型

"symbols": {
    //資料源類型"DbType": {
      "type": "parameter", //它是參數
      "datatype": "choice", //選項類型
      "choices": [ //選項取值
        {
          "choice": "MsSQL",
          "description": "MS SQL Server"
        },
        {
          "choice": "MySQL",
          "description": "MySQL"
        },
        {
          "choice": "PgSQL",
          "description": "PostgreSQL"
        },
        {
          "choice": "SQLite",
          "description": "SQLite"
        },
        {
          "choice": "None",
          "description": "None"
        }
      ],
      "defaultValue": "None",
      "description": "The type of SQL to use"
    },
    "MsSQL": {
      "type": "computed",
      "value": "(DbType == \"MsSQL\")"
    },
    "MySQL": {
      "type": "computed",
      "value": "(DbType == \"MySQL\")"
    },
    "PgSQL": {
      "type": "computed",
      "value": "(DbType == \"PgSQL\")"
    },
    "SQLite": {
      "type": "computed",
      "value": "(DbType == \"SQLite\")"
    },
    "None": {
      "type": "computed",
      "value": "(DbType == \"None\")"
    }
  }      

   b) 修改項目檔案:根據條件選擇對應程式集

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup Condition="'$(None)'!='True'">
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.8" />
  </ItemGroup>
  <ItemGroup  Condition="'$(SQLite)' == 'True'">
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.8" />
  </ItemGroup>
  <ItemGroup  Condition="'$(MsSQL)' == 'True'">
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.8" />
  </ItemGroup>
  <ItemGroup  Condition="'$(PgSQL)' == 'True'">
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
  </ItemGroup>
</Project>      

   c) 使用資料庫處,同步處理

#if (!None)
            //審計日志存儲
            services.AddDbContext<AuditLogDBContent>(options =>
            {
                string conn = Configuration.GetConnectionString("LogDB");
#if Sqlite
                options.UseSqlite(conn, options =>
                {
                    options.MigrationsAssembly("AuditLogDemo");
                });
#endif
#if PgSQL
                options.UseNpgsql(conn);
#endif

#if MsSQL
                options.UseSqlServer(conn);
#endif

            });
#endif      

   d) 更新模闆後,檢視已生成了對應參數

    

.NET Core - 自定義項目模闆

    e) 建立項目檢視生效情況:    

//不使用資料庫
dotnet new apiTmp -n AA -D None

//使用PG資料庫
dotnet new apiTmp -n BB -D PgSQL      
.NET Core - 自定義項目模闆
.NET Core - 自定義項目模闆

    可以看到項目引用和程式代碼都根據傳入參數生成了。    

3、項目模闆打包釋出

  好東西當然不能隻給自己使用,而應該怎麼将生成的模闆給大家使用呢?——Nuget 包釋出

 a)在模闆根目錄建立一個 nuspec檔案:apiTmp.nuspec

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
  <metadata>
    <id>apiTmp</id>
    <version>1.0.0</version>
    <description> WebApi Template </description>
    <authors>cwshegn</authors>
    <packageTypes>
      <packageType name="Template" />
    </packageTypes>
  </metadata>
</package>      

 b)使用Nuget Pack 指令打包  

nuget pack apiTmp.nuspec -OutputDirectory .      

 c)  釋出到nuget服務,給小夥伴們下載下傳使用

總結:

 通過dotnet cli 建立的模闆項目,能更友善的根據項目需求生成對應的項目結構,提升開發效率。

 可以動手把積累的好項目打包成一個模闆項目給小夥伴們使用

參考:

https://devblogs.microsoft.com/dotnet/how-to-create-your-own-templates-for-dotnet-new/

https://github.com/dotnet/dotnet-template-samples

https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-new

https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools

繼續閱讀