原文鏈接:https://blog.zhuliang.ltd/2019/07/backend/custom-template-using-dotnetcore.html
轉(zhuǎn)載請(qǐng)注明出處构韵。
場(chǎng)景:日常工作中,你可能會(huì)碰到需要新建一個(gè)全新的解決方案的情況(如公司新起了一個(gè)新項(xiàng)目趋艘,需要有全新配套的后臺(tái)程序)疲恢,如果公司內(nèi)部基礎(chǔ)框架較多、解決方案需要DDD模式等瓷胧,那么從新起項(xiàng)目到各種依賴引用到能實(shí)際可用显拳,一大堆的配置都需要重新設(shè)定、測(cè)試搓萧,耗時(shí)耗力杂数,根據(jù)項(xiàng)目的大小遇八,往往可能需要 1-2 小時(shí)甚至更久。在 .net core 之前耍休,雖然有相關(guān)的解決方法可以實(shí)現(xiàn)“項(xiàng)目模板”這個(gè)需求刃永,但在具體操作時(shí)很不方便,從 .net core 1.0 開始羊精,提供了“模板引擎”斯够,增加了 dotnet new --install(-i) 命令和選項(xiàng),通過該命令喧锦,可以讓你方便的創(chuàng)建屬于你自己的項(xiàng)目模板读规。
通過本文你可以了解和掌握:
- 掌握如何將一個(gè)現(xiàn)有解決方案中的項(xiàng)目作為項(xiàng)目模板。
- 掌握如何在本地創(chuàng)建項(xiàng)目模板并安裝和使用燃少。
- 掌握如何將本地模板打包成 nuget 包束亏,并通過包 id 進(jìn)行安裝使用該模板。
- 了解阵具、掌握簡(jiǎn)單的 dotnet 和 nuget 命令及其配置碍遍。(windows 和 mac 會(huì)做差異說明)
準(zhǔn)備工作
本次項(xiàng)目結(jié)構(gòu)如下(DDD):
你可以在我的 github 庫(kù):https://github.com/ArtechChu/Template 直接下載該模板源碼
- 用于發(fā)布的項(xiàng)目一共兩個(gè),Template.Console 和 Template.WebApi
- 其中 Console 項(xiàng)目就是簡(jiǎn)單的引用了下其他項(xiàng)目進(jìn)行輸出阳液。
- WebApi 項(xiàng)目簡(jiǎn)單配置了下依賴注入怕敬,你可以將此項(xiàng)目作為 api 模板項(xiàng)目來說
Console 項(xiàng)目概要:
WebApi 項(xiàng)目概要:
將本地項(xiàng)目作為本地模板,通過命令進(jìn)行安裝和使用
-
本次示例以 Console 為例帘皿,將控制臺(tái)項(xiàng)目涉及到的項(xiàng)目拷貝一份到如下文件夾中:
image 手動(dòng)創(chuàng)建一個(gè)名為“.template.config”的文件夾东跪,并在該文件夾內(nèi)創(chuàng)建文件:template.json
{
"$schema": "http://json.schemastore.org/template",
"author": "Artech",
"classifications": [ "Console" ],
"name": "Custom Console",
"identity": "Custom Console", //模板唯一標(biāo)識(shí)
"groupIdentity": "Custom Console",
"shortName": "CustomConsole", //【修改】短名稱,使用 dotnet new <shortName> 安裝模板時(shí)的名稱
"tags": {
"language": "C#",
"type": "project"
},
"sourceName": "Template", //【修改】在使用 -n 選項(xiàng)時(shí)鹰溜,會(huì)替換模板中項(xiàng)目的名字
"preferNameDirectory": true
}
- 這里主要說明下 shortName 和 sourceName 這 2 個(gè)屬性虽填。
- shortName:短名稱,用于在使用“dotnet new -l”命令時(shí)顯示曹动,安裝時(shí)也可直接根據(jù)該短名稱進(jìn)行安裝斋日。
- sourceName:當(dāng)我們?cè)谑褂?dotnet new" 命令進(jìn)行安裝時(shí),如果指定了 -n 或者 -o 選項(xiàng)仁期,那么選項(xiàng)后面的名字會(huì)自動(dòng)替換 sourceName 中指定的名字桑驱,因?yàn)槲覀兊捻?xiàng)目命名規(guī)則是 "Template.XXXX"竭恬,所 這里設(shè)定為“Template”跛蛋,如果你的項(xiàng)目命名規(guī)則是“公司.項(xiàng)目.XXX”,那么這里請(qǐng)?jiān)O(shè)定為“公司.項(xiàng)目”痊硕。
安裝該模板到本地模板庫(kù)
# 通過如下命令查看當(dāng)前本機(jī)已安裝模板:
dotnet new -l
# 模板安裝命令:dotnet new i <path | nugetId>
# 這里因?yàn)槭前惭b本地模板赊级,直接使用路徑(絕對(duì)和相對(duì)均可)
dotnet new -i .
- 安裝該短名稱為 CustomConsole 的模板
假定安裝路徑為 D:\TestTemplate
假定新起的項(xiàng)目名為“Company.Group”
# 這里使用 -n 和 -o 選項(xiàng)來分別指定新項(xiàng)目的名字以及輸出目錄
# 設(shè)定新項(xiàng)目的名字為“Company.Group”,因?yàn)楫?dāng)前定位已經(jīng)在 TestTemplate 文件夾內(nèi)岔绸,所以直接用“.”理逊,如下:
dotnet new CustomConsole -n Company.Group -o .
文件夾內(nèi)容如下:
- 使用模板新建的項(xiàng)目文件夾自動(dòng)為“Company.Group.XXXX”
測(cè)試:
更多關(guān)于 template.json 的說明請(qǐng)參考:http://json.schemastore.org/template
- 在 template.json 中橡伞,你還可以指定 symbols 等,來實(shí)現(xiàn)更多的自定義功能晋被,如聯(lián)動(dòng)預(yù)編譯指令等等兑徘。
將本地項(xiàng)目打包為 nuget 包,并通過命令進(jìn)行安裝和使用
本次示例以 Console +WebApi 為例羡洛,在 Templates\Nuget 文件夾中挂脑,建立 Content 文件夾用于存放 nuget 包內(nèi)容,具體如下:
- ConsoleTemplate 中的 .template.config\template.json 內(nèi)容同上方 Console 示例欲侮。
- WebApiTemplate 中的 .template.config\template.json 內(nèi)容如下:
{
"$schema": "http://json.schemastore.org/template",
"author": "Artech",
"classifications": [ "WebApi" ],
"name": "Custom WebApi",
"identity": "Custom WebApi",
"groupIdentity": "Custom WebApi",
"shortName": "CustomWebApi",
"tags": {
"language": "C#",
"type": "project"
},
"sourceName": "Template",
"preferNameDirectory": true
}
- 在 content 目錄內(nèi)創(chuàng)建一個(gè) nuspec 文件:Custom.Template.NetCore.nuspec崭闲,內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>Custom.Template.NetCore</id>
<version>1.0.1</version>
<description>
Custom Template, including WebApi, Console
</description>
<authors>Artech</authors>
<packageTypes>
<packageType name="Template" />
</packageTypes>
</metadata>
</package>
- 需要注意,packageType 為 Template威蕉,metadata.id 必須保證唯一刁俭,其他按需設(shè)置即可。
- 必須是在 content 文件夾內(nèi)韧涨。nuget 在打包的時(shí)候牍戚,是根據(jù) content 文件夾來進(jìn)行的。
- 使用 nuget pack 命令打包
# 注意路徑的相對(duì)位置
nuget pack Custom.Template.NetCore.nuspec -OutputDirectory .
- 打包后的內(nèi)容為:
- 發(fā)布該 nuget 包到 nuget server
這里用的是自建 nuget server虑粥,你可以按自身情況打包上傳翘魄。
- 你可以直接使用 Nuget Package Explorer 進(jìn)行發(fā)布包
- 也可以使用 nuget push 來發(fā)布,如下:
nuget push Custom.Template.NetCore.1.0.1.nupkg -Source "你的nuget 服務(wù) url" -ApiKey "你的nuget api key"
- 通過 nuget 安裝模板到本地
- 安裝前本地已經(jīng)安裝的模板如下:
- 安裝
dotnet new -i Custom.Template.NetCore::*
- 通過模板安裝 CustomWebApi
安裝路徑為:D:\TestWebApiTemplate
dotnet new CustomWebApi -n Company.Group -o .
- 創(chuàng)建一個(gè)解決方案舀奶,并將所有的項(xiàng)目添加到解決方案 Company.Group.sln 中
dotnet new sln -n Company.Group
# windows 下無(wú)法使用 glob pattern 只能逐個(gè)添加
dotnet sln Company.Group.sln add Company.Group.Application\Company.Group.Application.csproj
dotnet sln Company.Group.sln add Company.Group.Domain\Company.Group.Domain.csproj
dotnet sln Company.Group.sln add Company.Group.DomainService\Company.Group.DomainService.csproj
dotnet sln Company.Group.sln add Company.Group.IApplication\Company.Group.IApplication.csproj
dotnet sln Company.Group.sln add Company.Group.IDomainService\Company.Group.IDomainService.csproj
dotnet sln Company.Group.sln add Company.Group.Infrastructure.CrossCutting\Company.Group.Infrastructure.CrossCutting.csproj
dotnet sln Company.Group.sln add Company.Group.Repository\Company.Group.Repository.csproj
dotnet sln Company.Group.sln add Company.Group.WebApi\Company.Group.WebApi.csproj
如果你用的是 mac / linux 暑竟,則可以直接用 globbing pattern 來添加,如下:
dotnet sln Company.Group.sln add **/*.csproj
參考
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?tabs=netcore22
https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools