標題:從零開始實現ASP.NET Core MVC的插件式開發(二) - 如何建立項目模板
做者:Lamond Lu
地址:http://www.javashuo.com/article/p-cczcrief-gb.html
源代碼:https://github.com/lamondlu/Mystiquehtml
在上一篇中,咱們介紹了經過一個最簡單了例子,給你們演示了一下,如何在ASP.NET Core Mvc中藉助ApplicationPart來開發一個插件。在文章的最後,咱們也提出了一些待解決的問題。git
首先呢,第一個要解決問題是,每次咱們建立一個新的插件,每次都要從新建立項目,添加類庫引用,以及手動修改 csproj 文件,很是的繁瑣。那麼有沒有一種方式能夠減小這部分操做的?github
回想一下,當咱們每次使用 Visual Studio建立項目的時候,咱們均可以選擇一個項目模板,Visual Studio不只能夠根據咱們選擇的模板建立出項目,並且咱們所需的程序集引用都會預先配置好,不須要咱們重複配置了。那麼咱們是否能夠本身建立一些模板呢?答案是確定的。json
本文中,我就來給你們演示一下,在如何爲.NET Core項目建立項目模板,簡化操做流程。asp.net
若是要建立一個項目模板,咱們須要作2件事情。ide
這裏咱們以前已經建立了一個DemoPlugin1的項目了,因此此次咱們能夠直接將其轉換成一個模板項目。.net
首先咱們在當前項目中添加一個 .template.config
目錄, 並在其中添加一個 template.json 文件。內容以下:插件
{ "author": "Lamond Lu", "classifications": [ "Web/Plugins" ], "name": "DemoPlugin1", "identity": "LamondDynamicPlugins", "shortName": "ldp", "tags": { "language": "C#" , "type":"project" }, "sourceName": "DemoPlugin1", "preferNameDirectory": true }
配置說明:debug
Author
屬性指明瞭模板的做者,必填classifications
屬性指明瞭模板的分類,必填name
表示模板的名稱,當你使用dotnet new
建立項目時,指定的模板名稱,必填identity
表示模板的惟一名稱,可選shortName
表示模板的簡短名稱,必填tags
爲當前模板指定了一些標籤sourceName
指定了一個字符串,當使用dotnet new
指定-n參數的時候,-n參數的值,會替換sourceName
指定的字符串。以當前項目爲例,咱們的項目文件名稱和全部使用的命名空間都是DemoPlugin1, 可是若是咱們生成新的項目不可能都是用這個名字,因此咱們須要使用-n參數指定的項目名來替換"DemoPlugin1", 若是當前dotnet new
命令指定的-n參數值爲DemoPlugin2, 當項目建立成功時候,項目中全部的命名空間以及項目文件名稱,都會使用新的DemoPlugin2preferNameDirectory
, 是否生成相同名稱的目錄,可選。針對
template.json
的詳細配置列表,有興趣的同窗能夠查看如下連接<https://github.com/dotnet/templating/wiki/Reference-for-template.json>3d
編寫完代碼以後,咱們就可使用以下dotnet-CLI
的命令來安裝項目模板了。
dotnet new -i <PATH>
這裏
<PATH>
指定了當前模板項目所在的目錄
運行命令以後,會輸出一個最新的本地模板列表,咱們能夠發現DemoPlugin1
已經做爲模板出如今了列表中。
dotnet new
建立項目當模板安裝到本地以後,咱們就可使用dotnet new
命令來建立項目了,好比咱們如今要建立一個新的插件,咱們就可使用以下命令。
dotnet new ldp -n DemoPlugin2
運行命令以後,對應的代碼就生成出來了。來到項目目錄中,咱們發現以前的DemoPlugin1.csproj
文件已經被改名爲DemoPlugin2.csproj
, 這說明以前在template.json
文件中指定的sourceName
屬性幫我咱們正確的替換了項目文件名。
隨後,咱們能夠在查看一個代碼中惟一個控制器,其命名空間也被正確替換了。
怎麼樣?這樣是否是比以前手動的方式簡單的不少?
注:若是你想要卸載剛剛安裝的模板,你須要使用
dotnet new --debug:reinit
命令, 這裏使用dotnet new -u
命令是沒法卸載的,dotnet new -u
只適用與從nuget.org下載下來的模板包
除了以上這種使用項目目錄建立項目模板的方式,咱們還能夠將模板打包成Nuget包供其餘人使用。
若是要建立一個模板,這裏首先咱們須要建立一個Nuget包的元數據文件,這裏咱們命名爲LamondDynamicPlugin.nuspec
<?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"> <metadata> <id>LamondDynamicPlugin</id> <version>1.0.0</version> <description> Creates dynamic plugin in asp.net core </description> <authors>Lamond Lu</authors> <packageTypes> <packageType name="Template" /> </packageTypes> </metadata> </package>
這裏設置的屬性都很簡單,惟一須要注意的
packageType
必定要設置成Template
。
編寫好元數據文件以後,咱們就可使用Nuget pack
命令來打包了, 這個命令的第一個參數就是指定一個.nuspec
文件所在的路徑。
nuget pack DemoPlugin1/LamondDynamicPlugin.nuspec
運行以後,Nuget會生成一個LamondDynamicPlugin.nupkg
文件,這個就是咱們所說的Nuget包了。
爲了使用Nuget包的方式安裝模板,咱們可使用相同的命令dotnet new -i
dotnet new -i LamondDynamicPlugin.nupkg
固然,一般來講咱們都會將這個Nuget包發佈到nuget.org, 這樣就能夠將這個模板分享給其餘人了。
發佈到Nuget以後,咱們就可使用LamondDynamicPlugin.nuspec
中定義的惟一id來安裝模板了。安裝的命令和以前從目錄安裝模板是同樣的。
dotnet new -i LamondDynamicPlugin
若是你想卸載某個模板,只須要使用dotnet new -u [Nuget包]
便可。
dotnet new -u LamondDynamicPlugin
本文中我演示瞭如何使用dotnet-CLI
建立一個.NET Core的項目模板,以及如何使用Nuget來打包項目模板供其餘人使用,這樣就解決了咱們以前手動建立插件項目繁瑣的問題。下一期,我會嘗試將模塊的業務邏輯抽象出來,建立一個核心類庫,你們敬請期待。