通過 .NET CORE 提供的項(xiàng)目模板呜魄,減少重復(fù)勞動(dòng)师倔,提高效率

原文鏈接: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)目模板读规。

通過本文你可以了解和掌握:

  1. 掌握如何將一個(gè)現(xiàn)有解決方案中的項(xiàng)目作為項(xiàng)目模板。
    1. 掌握如何在本地創(chuàng)建項(xiàng)目模板并安裝和使用燃少。
    2. 掌握如何將本地模板打包成 nuget 包束亏,并通過包 id 進(jìn)行安裝使用該模板。
  2. 了解阵具、掌握簡(jiǎn)單的 dotnet 和 nuget 命令及其配置碍遍。(windows 和 mac 會(huì)做差異說明)

準(zhǔn)備工作

本次項(xiàng)目結(jié)構(gòu)如下(DDD):

你可以在我的 github 庫(kù):https://github.com/ArtechChu/Template 直接下載該模板源碼

image
  • 用于發(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)目概要:

image

WebApi 項(xiàng)目概要:

image

將本地項(xiàng)目作為本地模板,通過命令進(jìn)行安裝和使用

  1. 本次示例以 Console 為例帘皿,將控制臺(tái)項(xiàng)目涉及到的項(xiàng)目拷貝一份到如下文件夾中:

    image
  2. 手動(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 
image
# 模板安裝命令:dotnet  new  i <path | nugetId>
# 這里因?yàn)槭前惭b本地模板赊级,直接使用路徑(絕對(duì)和相對(duì)均可)
dotnet  new  -i  .
image
  1. 安裝該短名稱為 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   .
image

文件夾內(nèi)容如下:

image
  • 使用模板新建的項(xiàng)目文件夾自動(dòng)為“Company.Group.XXXX”

測(cè)試:

image

更多關(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)容,具體如下:

image
  • 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
}
  1. 在 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)行的。
  1. 使用 nuget pack 命令打包

# 注意路徑的相對(duì)位置
nuget   pack   Custom.Template.NetCore.nuspec   -OutputDirectory   .

image
  • 打包后的內(nèi)容為:
image
  1. 發(fā)布該 nuget 包到 nuget server

這里用的是自建 nuget server虑粥,你可以按自身情況打包上傳翘魄。

image
  • 你可以直接使用 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"
  1. 通過 nuget 安裝模板到本地
  • 安裝前本地已經(jīng)安裝的模板如下:
image
  • 安裝
dotnet new -i Custom.Template.NetCore::*
image
  1. 通過模板安裝 CustomWebApi

安裝路徑為:D:\TestWebApiTemplate

dotnet  new  CustomWebApi  -n  Company.Group  -o  .
  1. 創(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
image

如果你用的是 mac / linux 暑竟,則可以直接用 globbing pattern 來添加,如下:

dotnet sln Company.Group.sln add **/*.csproj
image

參考

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末育勺,一起剝皮案震驚了整個(gè)濱河市但荤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涧至,老刑警劉巖腹躁,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異南蓬,居然都是意外死亡纺非,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門赘方,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烧颖,“玉大人,你說我怎么就攤上這事窄陡】换矗” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肤粱。 經(jīng)常有香客問我瓮增,道長(zhǎng)谣辞,這世上最難降的妖魔是什么覆获? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任鱼炒,我火速辦了婚禮缩焦,結(jié)果婚禮上叫乌,老公的妹妹穿的比我還像新娘踩衩。我一直安慰自己胞皱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布九妈。 她就那樣靜靜地躺著反砌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萌朱。 梳的紋絲不亂的頭發(fā)上宴树,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音晶疼,去河邊找鬼酒贬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛翠霍,可吹牛的內(nèi)容都是我干的锭吨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寒匙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼零如!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锄弱,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤考蕾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后会宪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肖卧,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年掸鹅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塞帐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巍沙,死狀恐怖葵姥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赎瞎,我是刑警寧澤牌里,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布颊咬,位于F島的核電站务甥,受9級(jí)特大地震影響牡辽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敞临,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一态辛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挺尿,春花似錦奏黑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至窄俏,卻和暖如春蹂匹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凹蜈。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工限寞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仰坦。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓履植,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悄晃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玫霎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359