.NET Core自定義項(xiàng)目模板的全過(guò)程
前言:
前面介紹 自定義項(xiàng)目模板 中介紹了一種簡(jiǎn)單的方式——通過(guò)創(chuàng)建項(xiàng)目導(dǎo)出為項(xiàng)目模板方式實(shí)現(xiàn)。本次將采用dotenet cil(手腳架)來(lái)創(chuàng)建項(xiàng)目模板。
那么,我們首先看下當(dāng)前dotnet 支持的項(xiàng)目模板:

可以看到當(dāng)前dotnet中已經(jīng)提供了很多模板項(xiàng)目,那么如何根據(jù)項(xiàng)目開(kāi)發(fā)的積累內(nèi)容通過(guò)dotnet cli創(chuàng)建一個(gè)自己的項(xiàng)目來(lái)提升開(kāi)發(fā)效率呢?
1、實(shí)現(xiàn)自定義項(xiàng)目模板
自定義模板項(xiàng)目模板肯定就需要模板實(shí)現(xiàn),本次就使用使用之前文章中項(xiàng)目結(jié)構(gòu)作為模板項(xiàng)目來(lái)實(shí)現(xiàn)自定義項(xiàng)目模板

接下跟著步驟來(lái)創(chuàng)建模板項(xiàng)目
創(chuàng)建模板配置文件
在項(xiàng)目根文件夾中創(chuàng)建文件夾:.template.config 并在目錄下創(chuàng)建 template.json。如下圖:

定義項(xiàng)目模板相關(guān)信息
修改template.json內(nèi)容為以下內(nèi)容:
{
"author": "cwsheng", //必須
"classifications": [ "Web/WebAPI" ], //必須,這個(gè)對(duì)應(yīng)模板的Tags
"name": "ApiTmp", //必須,這個(gè)對(duì)應(yīng)模板的Templates
"identity": "ApiTemplate", //可選,模板的唯一名稱
"shortName": "apitmp", //必須,這個(gè)對(duì)應(yīng)模板的Short Name
"tags": {
"language": "C#" ,
"type":"project"
},
"sourceName": "ApiTemplate", // 可選,要替換的名字
"preferNameDirectory": true // 可選,添加目錄
}
注意:shortName和sourceName
- author:模板作者
- classifications:模板特征標(biāo)識(shí)。上文舉例的配置是因?yàn)槲易远x的模板包括了console和webapi。
- identity:此模板的唯一名稱
- name:用戶看到的模板名稱
- shortName:短名稱。當(dāng)使用CLI命令創(chuàng)建模板項(xiàng)目時(shí),使用短名稱將利于使用。
- sourceName:模板替換的關(guān)鍵文本,使用時(shí)需要注意,要選擇合適的替換文本,不然容易誤傷代碼。
項(xiàng)目模板安裝
接下來(lái)進(jìn)入項(xiàng)目目錄,將這個(gè)模板安裝到cli中。使用dotnet new -i 進(jìn)行模板的安裝。
dotnew new -i TempDemo

卸載項(xiàng)目模板:
dotnet new -u 模板目錄
使用命令創(chuàng)建項(xiàng)目:
dotnet new apiTmp -n Test -o .
apiTmp:是模板配置文件中指定的shortName。
-n:指定的是將項(xiàng)目中出現(xiàn)的所有文本MyJob替換為Test,因?yàn)榕渲弥衧ourceName是ApiTemplate,可按需配置。
-o:指定的是生成項(xiàng)目輸出目錄,上述命令生成項(xiàng)目輸出到當(dāng)前目錄。
結(jié)果如下圖:
此通過(guò)dotnet cli創(chuàng)建項(xiàng)目模板已完成,但僅僅這樣完全不能滿足日常工作需求。
如:A項(xiàng)目需要日志記錄,但B項(xiàng)目不需要日志記錄;A項(xiàng)目需要制定PG數(shù)據(jù)庫(kù)作為存儲(chǔ)方式,B項(xiàng)目需要制定MySQL作為存儲(chǔ)方式。
那么這些問(wèn)題能否在項(xiàng)目創(chuàng)建時(shí)根據(jù)設(shè)置而滿足項(xiàng)目需求呢?
2、模板項(xiàng)目進(jìn)階用法
文件過(guò)濾:根據(jù)參數(shù)過(guò)濾制定文件和代碼內(nèi)容
a) 定義參數(shù):在template.json中添加以下內(nèi)容:EnableAuditLog-參數(shù)名稱
{
//……
"symbols": {
//是否使用審計(jì)日志功能
"EnableAuditLog": {
"type": "parameter", //它是參數(shù)
"dataType": "bool", //bool類(lèi)型的參數(shù)
"defaultValue": "false" //默認(rèn)是不啟用
}
},
"sources": [
{
"modifiers": [
{
"condition": "(!EnableAuditLog)", //條件,由EnableAuditLog參數(shù)決定
"exclude": [ //排除下面的文件
"AuditLogDemo/Fliters/AuditLogActionFilter.cs"
]
}
]
}
]
}
b) 取消審計(jì)日志生效位置:

c) 重新生成模板,查看當(dāng)前模板支持的參數(shù):

d) 創(chuàng)建項(xiàng)目檢查設(shè)置是否生效:

選擇執(zhí)行:根據(jù)變量值選擇程序集引用
a) 添加參數(shù):DbType指定選項(xiàng)數(shù)據(jù)庫(kù)類(lèi)型
"symbols": {
//數(shù)據(jù)源類(lèi)型"DbType": {
"type": "parameter", //它是參數(shù)
"datatype": "choice", //選項(xiàng)類(lèi)型
"choices": [ //選項(xiàng)取值
{
"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) 修改項(xiàng)目文件:根據(jù)條件選擇對(duì)應(yīng)程序集
<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ù)庫(kù)處,同步處理
#if (!None)
//審計(jì)日志存儲(chǔ)
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) 更新模板后,查看已生成了對(duì)應(yīng)參數(shù)

e) 創(chuàng)建項(xiàng)目查看生效情況:
//不使用數(shù)據(jù)庫(kù) dotnet new apiTmp -n AA -D None //使用PG數(shù)據(jù)庫(kù) dotnet new apiTmp -n BB -D PgSQL


可以看到項(xiàng)目引用和程序代碼都根據(jù)傳入?yún)?shù)生成了。
3、項(xiàng)目模板打包發(fā)布
好東西當(dāng)然不能只給自己使用,而應(yīng)該怎么將生成的模板給大家使用呢?——Nuget 包發(fā)布
a)在模板根目錄創(chuàng)建一個(gè)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服務(wù),給小伙伴們下載使用
總結(jié):
通過(guò)dotnet cli 創(chuàng)建的模板項(xiàng)目,能更方便的根據(jù)項(xiàng)目需求生成對(duì)應(yīng)的項(xiàng)目結(jié)構(gòu),提升開(kāi)發(fā)效率。
可以動(dòng)手把積累的好項(xiàng)目打包成一個(gè)模板項(xiàng)目給小伙伴們使用
參考:
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
到此這篇關(guān)于.NET Core自定義項(xiàng)目模板的文章就介紹到這了,更多相關(guān).NET Core自定義項(xiàng)目模板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET(C#) String, StringBuilder 與 StringWriter性能比較
ASP.NET(C#) String, StringBuilder 與 StringWriter性能比較...2007-08-08
使用 ServiceStack.Text 序列化 json的實(shí)現(xiàn)代碼
今天發(fā)篇文章總結(jié)下自己使用 ServiceStack.Text 來(lái)序列化 json。它的速度比 Newtonsoft.Json 快很多,在測(cè)試時(shí)發(fā)現(xiàn)比 fastJson 還快些2013-06-06
asp.net UrlReWriter使用經(jīng)驗(yàn)小結(jié)
UrlRewriter 是微軟封裝好了的一個(gè)URL重寫(xiě)組件。使用它可以讓我節(jié)約很多自已開(kāi)發(fā)的時(shí)間。 好了,開(kāi)始講述我的應(yīng)用經(jīng)驗(yàn),這只是很菜鳥(niǎo)的經(jīng)驗(yàn),高手就不用看了。2008-11-11
用擴(kuò)展方法優(yōu)化多條件查詢(不定條件查詢)
在我們開(kāi)發(fā)過(guò)程中,特別是管理系統(tǒng)的開(kāi)發(fā),經(jīng)常會(huì)遇到多條件查詢(或者叫不定條件查詢)的案例,就是提供給User輸入的查詢條件有多個(gè)不同的查詢欄位,而且,在實(shí)際使用中并不能確定User會(huì)使用哪些條件來(lái)當(dāng)做搜索條件2012-12-12
ASP.NET MVC頁(yè)面重定向簡(jiǎn)單介紹
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC頁(yè)面重定向的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
ASP.NET動(dòng)態(tài)設(shè)置頁(yè)面標(biāo)題的方法詳解
這篇文章介紹了ASP.NET動(dòng)態(tài)設(shè)置頁(yè)面標(biāo)題的方法詳解,有需要的朋友可以參考一下2013-07-07
asp.NET中實(shí)現(xiàn)文件的壓縮和解壓(3種方式)
本篇文章主要介紹了asp.NET中實(shí)現(xiàn)文件的壓縮和解壓,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2016-11-11

