.NET Core自定義項目模板的全過程
前言:
前面介紹 自定義項目模板 中介紹了一種簡單的方式——通過創(chuàng)建項目導出為項目模板方式實現(xiàn)。本次將采用dotenet cil(手腳架)來創(chuàng)建項目模板。
那么,我們首先看下當前dotnet 支持的項目模板:
可以看到當前dotnet中已經(jīng)提供了很多模板項目,那么如何根據(jù)項目開發(fā)的積累內(nèi)容通過dotnet cli創(chuàng)建一個自己的項目來提升開發(fā)效率呢?
1、實現(xiàn)自定義項目模板
自定義模板項目模板肯定就需要模板實現(xiàn),本次就使用使用之前文章中項目結(jié)構作為模板項目來實現(xiàn)自定義項目模板
接下跟著步驟來創(chuàng)建模板項目
創(chuàng)建模板配置文件
在項目根文件夾中創(chuàng)建文件夾:.template.config 并在目錄下創(chuàng)建 template.json。如下圖:
定義項目模板相關信息
修改template.json內(nèi)容為以下內(nèi)容:
{ "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命令創(chuàng)建模板項目時,使用短名稱將利于使用。
- sourceName:模板替換的關鍵文本,使用時需要注意,要選擇合適的替換文本,不然容易誤傷代碼。
項目模板安裝
接下來進入項目目錄,將這個模板安裝到cli中。使用dotnet new -i
進行模板的安裝。
dotnew new -i TempDemo
卸載項目模板:
dotnet new -u 模板目錄
使用命令創(chuàng)建項目:
dotnet new apiTmp -n Test -o .
apiTmp:是模板配置文件中指定的shortName。
-n:指定的是將項目中出現(xiàn)的所有文本MyJob
替換為Test
,因為配置中sourceName是ApiTemplate,可按需配置。
-o:指定的是生成項目輸出目錄,上述命令生成項目輸出到當前目錄。
結(jié)果如下圖:
此通過dotnet cli創(chuàng)建項目模板已完成,但僅僅這樣完全不能滿足日常工作需求。
如:A項目需要日志記錄,但B項目不需要日志記錄;A項目需要制定PG數(shù)據(jù)庫作為存儲方式,B項目需要制定MySQL作為存儲方式。
那么這些問題能否在項目創(chuàng)建時根據(jù)設置而滿足項目需求呢?
2、模板項目進階用法
文件過濾:根據(jù)參數(shù)過濾制定文件和代碼內(nèi)容
a) 定義參數(shù):在template.json中添加以下內(nèi)容:EnableAuditLog-參數(shù)名稱
{ //…… "symbols": { //是否使用審計日志功能 "EnableAuditLog": { "type": "parameter", //它是參數(shù) "dataType": "bool", //bool類型的參數(shù) "defaultValue": "false" //默認是不啟用 } }, "sources": [ { "modifiers": [ { "condition": "(!EnableAuditLog)", //條件,由EnableAuditLog參數(shù)決定 "exclude": [ //排除下面的文件 "AuditLogDemo/Fliters/AuditLogActionFilter.cs" ] } ] } ] }
b) 取消審計日志生效位置:
c) 重新生成模板,查看當前模板支持的參數(shù):
d) 創(chuàng)建項目檢查設置是否生效:
選擇執(zhí)行:根據(jù)變量值選擇程序集引用
a) 添加參數(shù):DbType指定選項數(shù)據(jù)庫類型
"symbols": { //數(shù)據(jù)源類型"DbType": { "type": "parameter", //它是參數(shù) "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) 修改項目文件:根據(jù)條件選擇對應程序集
<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) 使用數(shù)據(jù)庫處,同步處理
#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) 更新模板后,查看已生成了對應參數(shù)
e) 創(chuàng)建項目查看生效情況:
//不使用數(shù)據(jù)庫 dotnet new apiTmp -n AA -D None //使用PG數(shù)據(jù)庫 dotnet new apiTmp -n BB -D PgSQL
可以看到項目引用和程序代碼都根據(jù)傳入?yún)?shù)生成了?! ?/p>
3、項目模板打包發(fā)布
好東西當然不能只給自己使用,而應該怎么將生成的模板給大家使用呢?——Nuget 包發(fā)布
a)在模板根目錄創(chuàng)建一個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) 發(fā)布到nuget服務,給小伙伴們下載使用
總結(jié):
通過dotnet cli 創(chuàng)建的模板項目,能更方便的根據(jù)項目需求生成對應的項目結(jié)構,提升開發(fā)效率。
可以動手把積累的好項目打包成一個模板項目給小伙伴們使用
參考:
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
到此這篇關于.NET Core自定義項目模板的文章就介紹到這了,更多相關.NET Core自定義項目模板內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ASP.NET(C#) String, StringBuilder 與 StringWriter性能比較
ASP.NET(C#) String, StringBuilder 與 StringWriter性能比較...2007-08-08使用 ServiceStack.Text 序列化 json的實現(xiàn)代碼
今天發(fā)篇文章總結(jié)下自己使用 ServiceStack.Text 來序列化 json。它的速度比 Newtonsoft.Json 快很多,在測試時發(fā)現(xiàn)比 fastJson 還快些2013-06-06asp.net UrlReWriter使用經(jīng)驗小結(jié)
UrlRewriter 是微軟封裝好了的一個URL重寫組件。使用它可以讓我節(jié)約很多自已開發(fā)的時間。 好了,開始講述我的應用經(jīng)驗,這只是很菜鳥的經(jīng)驗,高手就不用看了。2008-11-11asp.NET中實現(xiàn)文件的壓縮和解壓(3種方式)
本篇文章主要介紹了asp.NET中實現(xiàn)文件的壓縮和解壓,這里整理了詳細的代碼,有需要的小伙伴可以參考下。2016-11-11