更新:html
一、若是想使用個人 Blog.Core 項目,而且又想快速重命名成本身的項目,請看這個Wiki:https://github.com/anjoy8/Blog.Core/wiki/Temple-Nugetgit
開工是利啦!哈嘍各位小夥伴,週三好呀,新的一年又開始了,老張給你們作個榜樣,新的一年也要好好學習喲,這兩天閒的無事就整理整理了這個系列的 Github 代碼,增長了一個英文的 README ,而後把 netcore2.0 合併到了項目裏,並新建了一個2.0的分支,相信有些小夥伴應該也發現了,原本想試試 core 3.0版本,發現必需要安裝 Visual Studio 2019 版本,可憐電腦已經安裝了 vs15 和 vs17,因此就放棄了安裝vs19,等明年,哦不對,是今年😂微軟正式發佈3.0的時候,再整理一個分支吧(之後確定會有新的內容一直更新的)。github
(目前是2.2版本,因做者開源的項目較多,維護成本太高,因此本項目其餘分支再也不提供支持)web
在整理代碼的時候,我想到,上週在《38 ║自動初始化數據庫(不按期更新)》中,我把項目的自動建立數據庫並添加種子數據的功能給加上了,給你們提供了一個思路,之後你們建立項目能夠這麼玩兒,我的感受仍是很方便的,因而我就想到了一個問題,應該是隻要開發必定時間的小夥伴,都會遇到的問題:shell
情景:本身通過多年開發的沉澱後,開發出一個屬於本身的一套Demo項目,亦或是借鑑別人的項目後,優化了一個。好比個人第一個項目,採用 IService+ IRepository 分層的;或者好比個人第二個項目,採用DDD領域驅動+CQRS模式的。而後咱們在別的地方使用的時候(多是下一個公司),若是還想用本身的模板,也多是供新入職的同事使用,常常會是如下幾個辦法,你們看看你屬於哪種:數據庫
0、對比着以前的項目結構,在VistulStudio中手動建立一個空的解決方案,從零開始,一點一點搭建。// 麻煩之大,可想而知json
一、經過dotnet cli 命令來建立空項目,而後手動。// 會簡化一丟丟,但仍須要一層一層的建立類庫;api
二、把Demo工程代碼裏拷貝到U盤,或者上傳到雲盤,而後下載下來,改吧改吧。// 尋找過程很麻煩,依賴代碼承載工具;架構
三、把Demo工程代碼 Pull 到 Github 上,在別的地方直接 Clone ,而後改吧改吧。 // 開源出源碼,私密性不強;併發
你們能夠看到,上邊的這幾個辦法,都會有這樣或那樣的問題,快的不方便,方便的太侷限。這個時候你會說,這怎麼可能每天建立工程,有時候一個項目搭建好了能用一年,固然,這種也是有的,可是總會有新項目的,並且上邊的這些都有一個通病,不知道你們是否發現:就是不能快速修改工程名稱!舉個栗子,個人這個 Github 上的項目,你們下載下來,怎麼快速把 Blog.Core 改爲 HelloBlog 呢?
這個時候我想到了一個東西,你們平時的時候應該用到過,就是使用 dotnet CLI 建立一個 net core api 項目是怎麼作的呢:
// 經過命令行建立 core api項目 dotnet new webapi
這麼建立好了之後,咱們就能夠本身一點一點的搭建項目了,這個時候我就想,那既然有 webapi 這個模板,咱們自定義一個屬於本身的一個或多個模板不就好了?!到時候只須要這麼簡單的輸入一行命令,就能生成一套項目,各層明確,引用清晰,能在任何有網的電腦上運行,而且直接就能跑,想一想都會感受很刺激,不是麼?!好比這樣:
// 經過自定義命令行建立本身的項目 dotnet new 我是模板名稱 -n HelloBlog
好啦,開始今天的講解 —— 自定義dotnet 模板,很簡單,只要你按照個人一步一步往下走,必定會看得懂。若是你看完本文,對你有幫助,請點個贊👍或評論📑喲。
最終的效果是這樣的:
既然我們要建立一個自定義的 dotnet 項目模板,那就必須本身先有本身的一套Code,有了這套 code,咱們才能導入到 dotnet cli 模板庫中使用。
今天呢,我就使用我們的這個Blog.Core 項目了(https://github.com/anjoy8/Blog.Core),若是你想用本身的模板,前提是:
一、必須Code已經成型了,意思就是說,分層清楚,引用明確,只不過沒有複雜的內容。
二、必須編譯成功,不能有任何錯誤,不然後邊會各類麻煩。
三、儘可能能跑起來,就是能顯示出界面,固然也不是必要條件,好比若是你新建了控制檯程序,是沒有web頁面的。
四、通常不要把生成的dll文件包含其中,若是你下載個人Github代碼,會發現只有400k,由於我把可執行文件都過濾了。
今天呢,我就手把手把我們的這套代碼給原封不動的分發導入到 dotnet 模板庫中,好比這樣(這是我本機測試的,正式模板會在下文詳細說明):
除了我們的這個項目,之後我還會創建一個基於DDD領域驅動設計的 dotnet 模板,這裏先留個坑,到時候把命令行放到這裏:(dotnet new -i xxxxxxx)
固然你也能夠建立一個,若是你的項目比較好,看完這篇文章後,能夠在下邊留言喲,讓你們都使用使用。
由於使用我們這個項目,因此這一步很簡單,注意不要把項目編譯後的dll文件包含裏邊,一方面打包的時候佔資源,另外一方面可能會出錯,
那項目源代碼準備好了,接下來怎麼作呢,彆着急,請往下看。
如今咱們就須要把上邊準備的項目導入 dotnet 模板了:
在你的電腦任何地方,新建一個模板文件夾temple,用於之後打包多個模板使用,好比我是這樣的(儘可能按照這個格式來:content文件夾包含code模板):
├── temple // 用來存放全部的模板 │ ├── BlogCoreTemple // BlogCore模板所有內容 │ │ ├── content // 存放Code 項目代碼,可直接運行 │ │ │ ├── Blog.Core │ │ │ ├── . │ │ │ ├── . │ │ │ ├── . │ │ │ ├── Blog.Core.Services │ │ │ └── Blog.Core.sln │ │ │ │ │ ├── license // 存放版本許可信息,若是不添加,後邊會警告,文章後邊會提到 │ │ │ └── license.txt │ │ │ │ │ └── 其餘待定 // 這裏文章後邊會打包的時候用到 │ │ │ └── DDDTemple // DDD模板信息
既然咱們要自定義模板,那咱們就必須配置,好比做者信息,好比模板名稱,要否則dotnet咋知道哪個模板是你自定義的呢。接下來我們定義配置文件:
{ "$schema": "http://json.schemastore.org/template",//template.json 文件的 JSON 架構,能夠不要該鍵值對 "author": "lao zhang", //必填!模板建立者 "classifications": [ "Web/WebAPI" ], //必填,這個對應模板的Tags,其餘的好比 [ "Common", "Console" ], "name": "Blog.Core Dotnet", //必填,這個是模板名,好比ASP.NET Core Web API "identity": "Blog.Core.Template", //可選,模板的惟一名稱 "shortName": "blogcoretpl", //必填,這個對應模板的短名稱,好比webapi "tags": { "language": "C#" , "type":"project" }, "sourceName": "Blog.Core", // 可選,要替換的名字,這個就是模板的項目名,之後新建的時候,會把這個名字替換成其餘,好比HelloBlog(警告!這裏不要寫一些專用詞彙,好比app呀,net呀,core之類的) "preferNameDirectory": true // 可選,添加目錄 }
提示:這個模板被執行分發,添加到 dotnet 模板後,儘可能保存好,不要刪掉,由於若是刪掉後,若是之後想卸載這個本地的模板,就不能了。
若要從本地文件系統卸載模板,須要徹底限定路徑。 例如,C:\Users\<USER>\Documents\Templates\GarciaSoftware.ConsoleTemplate.CSharp 有效。
詳細信息能夠查看官網:https://docs.microsoft.com/zh-cn/dotnet/core/tools/custom-templates
├── temple // 用來存放全部的模板 │ ├── BlogCoreTemple // BlogCore模板所有內容 │ │ ├── content // 存放Code 項目代碼,可直接運行 │ │ │ ├── .template.config // 模板配置文件夾 │ │ │ │ └── template.json // 配置文件 │ │ │ ├── Blog.Core │ │ │ ├── . │ │ │ ├── . │ │ │ ├── . │ │ │ ├── Blog.Core.Services │ │ │ └── Blog.Core.sln │ │ │ │ │ ├── license // 存放版本許可信息,若是不添加,後邊會警告,文章後邊會提到 │ │ │ └── license.txt │ │ │ │ │ └── 其餘待定 // 這裏文章後邊會打包的時候用到 │ │ │ └── DDDTemple // DDD模板信息
通過上面兩步的處理,我們已經把模板源代碼準備好了,而且也按照固定的規則,把配置文件配置好了,接下來就是來分發了,白話就是說:把代碼導入到 dotnet 模板裏。
這個是很簡單的,代碼DOS命令窗口,輸入命令(注意文件夾的路徑):
// 使用文件分發模板, // 注意文件路徑:content文件夾的上一級,能夠對比上邊的截圖中的文件夾結構 dotnet new -i D:\myTpl\temple\BlogCoreTemple
這個時候你會發現,系統中已經有了咱們的模板!(我爲了區別下文的第二種方法,故意在模板後加了個22)
與此對應的,就是卸載了,注意剛剛的那個文件地址不要刪了(就是把新建的字母 i 變成了 u):
dotnet new -u D:\myTpl\temple\BlogCoreTemple
隨便找一個其餘文件夾,而後執行咱們的操做:
成功了有沒有!是否是很方便!之後咱們把咱們的項目模板導入到本地的 dotnet 中,就能夠很快的搭建一個如出一轍的項目(這個時候若是你運行 dotnet run會報錯,由於咱們解耦了,會找不到service.dll文件,咱們手動F6編譯便可),並且項目名稱也能夠自定義是否是很給力!至少我是感受挺方便的。
可是,我開心了一分鐘後,發現了這個方法的一個弊端,聰明的你應該也發現了,由於咱們使用的是文件發佈,因此咱們只能在本機使用(不信的話,你能夠在你電腦上執行下這個命令 dotnet new blogcoretpl22,確定報錯),那若是在家裏,或者在新的公司,亦或讓新來的同事使用這個模板,該如何使用呢,總不能又要重蹈覆轍,開始拷貝代碼吧,哦NO!確定不想這樣,做爲強迫症的我,確定感受不是很爽,那怎麼辦呢,別慌,下邊的方法能夠完美的解決這個問題!
在 content 文件夾旁邊,添加 nuspec 文件。 nuspec 文件是 XML 清單文件,用於描述包內容,並促進建立 NuGet 包。
重要:感謝小夥伴@ jamee1696 提醒!下邊範本文件中的漢字只是個人解釋說明,若是你本身作,請千萬要去掉,不能帶中文字符!
<?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"> <metadata> <id>Blog.Core.Webapi.Template</id>// nuget包標識,在 nuget.org 或包駐留的任意庫中必須是惟一的 <version>1.0.0</version>// 遵循 major.minor.patch 模式的包版本。 <description> Creates a blog core webapi app.// 用於 UI 顯示的包的詳細說明。 </description> <authors>Lao zhang</authors>// 包建立者的逗號分隔列表,與 nuget.org 上的配置文件名稱一致 <packageTypes> <packageType name="Template" />// 包類型 </packageTypes> <license type="file">license\license.txt</license>// 上文提到的許可證信息 </metadata> </package>
上邊配置好了,那怎麼如何打包呢,如今我們就須要 nuget.exe 工具了:https://www.nuget.org/downloads ,下載最新的exe文件便可,注意這個不是安裝文件,這個須要配合着項目使用,若是你雙擊是無效的,把下載好的 nuget.exe 拷貝到 nuspec 範本文件同級的目錄中:
文件也配置好了,nuget執行文件也下載好了,接下來我們就是正式開始打包了:
打開 DOS 命令窗口,進入到當前文件夾,而後直接運行打包命令:(注意打包的文件,是我們建立的 nuspec 範本文件)
// 執行打包操做,文件地址就是 nuspec 範本地址 nuget pack D:\myTpl\temple\BlogCoreTemple\Blog.Core.Webapi.Template.nuspec
發現咱們以及打包成功:
注意:這裏有小夥伴提示錯誤nuget 命令行無效 ,你須要在nuget.exe 目錄裏操做,而且是 CMD 命令窗口,不是 powershell
固然你也能夠這樣:
將文件夾添加到 nuget.exe
中放置 PATH 環境變量的位置,這樣就能夠從任意位置使用 CLI 工具。
提醒下,你們要注意模板的質量,儘可能不要過多的上傳打包喲。
接下來就是最後一步了,將咱們打包成功的 nupkg 包,發佈到 nuget.org ,這裏有多種方法,我只演示web門戶操做:
首先你須要在 nuget.org 官網註冊帳號,這裏不細說,而後點擊到上傳頁面:https://www.nuget.org/packages/manage/upload
選擇 nuget.org 頂部菜單中的「上傳」,並瀏覽到包位置。
nuget.org 告知包名稱是否可用。 若是沒法使用,則更改項目中的包標識符、從新生成,並重試上傳。
若是包名稱可用,nuget.org 將打開「驗證」部分,能夠在其中查看包清單中的元數據。 若要更改任何元數據,請編輯項目(項目文件或 .nuspec
文件)、從新生成、從新建立包,而後再次上傳。
在「導入文檔」下,能夠粘貼 Markdown、將 URL 指向文檔,或上傳文檔文件。
當全部信息準備就緒後,選擇「提交」按鈕
上傳成功後,nuget 會後臺進行掃描病毒,而後進行發佈,中間大概等待10分鐘後,你會收到一個官方的郵件,提示你已經發布成功:
地址:https://www.nuget.org/packages/Blog.Core.Webapi.Template/
具體的參考官網:https://docs.microsoft.com/zh-cn/nuget/create-packages/publish-a-package#package-validation-and-indexing
在上邊發佈成功了之後,咱們直接就能夠經過 nuget 惟一包id,來進行導入dotnet 模板操做:
// 經過nuget.org ID 導入分發,這個名稱,就是咱們以前在 nuspec 範本文件中,配置的nuget包 ID dotnet new -i Blog.Core.Webapi.Template
而後就能夠看到已經導入成功了,至於使用,就和以前的經過文件系統導入的是同樣的:
是否是很不錯!徹底解放雙手,也不依賴工具,就能夠直接建立一套相同的項目,並能夠自定義項目名:
不信的話,你能夠在你電腦裏執行下剛剛的那個模板導入命令(dotnet new -i Blog.Core.Webapi.Template),能夠成功的導入到你的電腦裏(注意必定要是管理員權限打開命令行窗口,若是報錯,多是401權限問題,請在下方留言)。若是你用不了這個命令,證實你的電腦是沒有最高權限的,那就請用下邊的這個方法吧。
若是你不能直接用 nuget.org 的標識ID來分發模板,那就直接用 nupkg 包導入吧,下載本文中的包:https://www.nuget.org/api/v2/package/Blog.Core.Webapi.Template/1.0.0,或者用上邊本地的打包好的,是同樣的
而後執行命令:
// 將nupkg 包分發 dotnet new -i E:\my-file\temple\Blog.Core.Webapi.Template.1.0.0.nupkg
固然若是你不想要,也能夠,很簡單,直接執行這個命令就行
// 從 nuget.org 中存儲的 NuGet 包卸載模板 dotnet new -u Blog.Core.Webapi.Template
今天我們主要講解了如何把本身的源代碼Demo項目,分發到 dotnet 模板中;而後又講解了如何把本身的源代碼項目進行 nuget 打包,併發布到 nuget.org 庫中;
最後將發佈到 nuget 包分發到 dotne 模板中,方便的在任何地方使用。
已經在GitHub 上添加了,你們能夠下載看看:
而後在Nuget包管理器中,能夠找到,只不過這是一個整個工程,你們不用添加到項目裏,之後你若是建立一個Tool,能夠添加到這裏,還記得我們的ORM麼(https://github.com/anjoy8/AZLinli.ORM),我打算把這個提交上去,本身使用。
( 上邊打包的項目,在 Nuget 包中能夠搜到)
最終的文件結構是這樣的:
├── temple // 用來存放全部的模板 │ ├── BlogCoreTemple // BlogCore模板所有內容 │ │ ├── content // 存放Code 項目代碼,可直接運行 │ │ │ ├── .template.config // 模板配置文件夾 │ │ │ │ └── template.json // 配置文件 │ │ │ ├── Blog.Core │ │ │ ├── . │ │ │ ├── . │ │ │ ├── . │ │ │ ├── Blog.Core.Services │ │ │ └── Blog.Core.sln │ │ │ │ │ ├── license // 存放版本許可信息,若是不添加,後邊會警告,文章後邊會提到 │ │ │ └── license.txt │ │ │ │ │ ├── Blog.Core.Webapi.Template.nuspec // nuget 打包的範本配置文件 │ │ └── nuget.exe // nuget.exe 可執行文件 │ │ │ └── DDDTemple // DDD模板信息