標(biāo)題:從零開(kāi)始實(shí)現(xiàn)ASP.NET Core MVC的插件式開(kāi)發(fā)(二) - 如何創(chuàng)建項(xiàng)目模板
作者:Lamond Lu
地址:https://www.cnblogs.com/lwqlun/p/11155666.html
<https://www.cnblogs.com/lwqlun/p/11155666.html>
源代碼:https://github.com/lamondlu/DynamicPlugins
<https://github.com/lamondlu/DynamicPlugins>
在上一篇中,我們介紹了通過(guò)一個(gè)最簡(jiǎn)單了例子,給大家演示了一下,如何在ASP.NET Core
Mvc中借助ApplicationPart來(lái)開(kāi)發(fā)一個(gè)插件。在文章的最后,我們也提出了一些待解決的問(wèn)題。
首先呢,第一個(gè)要解決問(wèn)題是,每次我們創(chuàng)建一個(gè)新的插件,每次都要重新創(chuàng)建項(xiàng)目,添加類庫(kù)引用,以及手動(dòng)修改 csproj
文件,非常的繁瑣。那么有沒(méi)有一種方式可以減少這部分操作的?
回想一下,當(dāng)我們每次使用 Visual Studio創(chuàng)建項(xiàng)目的時(shí)候,我們都可以選擇一個(gè)項(xiàng)目模板,Visual
Studio不僅可以根據(jù)我們選擇的模板創(chuàng)建出項(xiàng)目,而且我們所需的程序集引用都會(huì)預(yù)先配置好,不需要我們重復(fù)配置了。那么我們是否可以自己創(chuàng)建一些模板呢?答案是肯定的。
本文中,我就來(lái)給大家演示一下,在如何為.NET Core項(xiàng)目創(chuàng)建項(xiàng)目模板,簡(jiǎn)化操作流程。
編寫template.json
如果要?jiǎng)?chuàng)建一個(gè)項(xiàng)目模板,我們需要做2件事情。
* 創(chuàng)建一份項(xiàng)目代碼作為模板
* 編寫template.json文件
這里我們之前已經(jīng)創(chuàng)建了一個(gè)DemoPlugin1的項(xiàng)目了,所以這次我們可以直接將其轉(zhuǎn)換成一個(gè)模板項(xiàng)目。
首先我們?cè)诋?dāng)前項(xiàng)目中添加一個(gè) .template.config目錄, 并在其中添加一個(gè) template.json 文件。內(nèi)容如下:
{ "author": "Lamond Lu", "classifications": [ "Web/Plugins" ], "name":
"DemoPlugin1", "identity": "LamondDynamicPlugins", "shortName": "ldp", "tags":
{ "language": "C#" , "type":"project" }, "sourceName": "DemoPlugin1",
"preferNameDirectory": true }
配置說(shuō)明:
* Author屬性指明了模板的作者,必填
* classifications屬性指明了模板的分類,必填
* name表示模板的名稱,當(dāng)你使用dotnet new創(chuàng)建項(xiàng)目時(shí),指定的模板名稱,必填
* identity表示模板的唯一名稱,可選
* shortName表示模板的簡(jiǎn)短名稱,必填
* tags為當(dāng)前模板指定了一些標(biāo)簽
* sourceName指定了一個(gè)字符串,當(dāng)使用dotnet new指定-n參數(shù)的時(shí)候,-n參數(shù)的值,會(huì)替換sourceName
指定的字符串。以當(dāng)前項(xiàng)目為例,我們的項(xiàng)目文件名稱和所有使用的命名空間都是DemoPlugin1,
但是如果我們生成新的項(xiàng)目不可能都是用這個(gè)名字,所以我們需要使用-n參數(shù)指定的項(xiàng)目名來(lái)替換"DemoPlugin1", 如果當(dāng)前dotnet new
命令指定的-n參數(shù)值為DemoPlugin2, 當(dāng)項(xiàng)目創(chuàng)建成功時(shí)候,項(xiàng)目中所有的命名空間以及項(xiàng)目文件名稱,都會(huì)使用新的DemoPlugin2
* preferNameDirectory, 是否生成相同名稱的目錄,可選。
針對(duì)template.json的詳細(xì)配置列表,有興趣的同學(xué)可以查看以下鏈接
<https://github.com/dotnet/templating/wiki/Reference-for-template.json>
<https://github.com/dotnet/templating/wiki/Reference-for-template.json>
使用dotnet-CLI創(chuàng)建模板
編寫完代碼之后,我們就可以使用如下dotnet-CLI的命令來(lái)安裝項(xiàng)目模板了。
dotnet new -i <PATH>
這里<PATH>指定了當(dāng)前模板項(xiàng)目所在的目錄
運(yùn)行命令之后,會(huì)輸出一個(gè)最新的本地模板列表,我們可以發(fā)現(xiàn)DemoPlugin1已經(jīng)作為模板出現(xiàn)在了列表中。
使用dotnet new創(chuàng)建項(xiàng)目
當(dāng)模板安裝到本地之后,我們就可以使用dotnet new命令來(lái)創(chuàng)建項(xiàng)目了,比如我們現(xiàn)在要?jiǎng)?chuàng)建一個(gè)新的插件,我們就可以使用如下命令。
dotnet new ldp -n DemoPlugin2
運(yùn)行命令之后,對(duì)應(yīng)的代碼就生成出來(lái)了。來(lái)到項(xiàng)目目錄中,我們發(fā)現(xiàn)之前的DemoPlugin1.csproj文件已經(jīng)被更名為DemoPlugin2.csproj
, 這說(shuō)明之前在template.json文件中指定的sourceName屬性幫我我們正確的替換了項(xiàng)目文件名。
隨后,我們可以在查看一個(gè)代碼中唯一個(gè)控制器,其命名空間也被正確替換了。
怎么樣?這樣是不是比之前手動(dòng)的方式簡(jiǎn)單的很多?
注:如果你想要卸載剛剛安裝的模板,你需要使用dotnet new --debug:reinit命令, 這里使用dotnet new -u命令是無(wú)法卸載的,
dotnet new -u只適用與從nuget.org下載下來(lái)的模板包
如何將模板打包成Nuget包
除了以上這種使用項(xiàng)目目錄創(chuàng)建項(xiàng)目模板的方式,我們還可以將模板打包成Nuget包供其他人使用。
如果要?jiǎng)?chuàng)建一個(gè)模板,這里首先我們需要?jiǎng)?chuàng)建一個(gè)Nuget包的元數(shù)據(jù)文件,這里我們命名為L(zhǎng)amondDynamicPlugin.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>
這里設(shè)置的屬性都很簡(jiǎn)單,唯一需要注意的packageType一定要設(shè)置成Template。
編寫好元數(shù)據(jù)文件之后,我們就可以使用Nuget pack命令來(lái)打包了, 這個(gè)命令的第一個(gè)參數(shù)就是指定一個(gè).nuspec文件所在的路徑。
nuget pack DemoPlugin1/LamondDynamicPlugin.nuspec
運(yùn)行之后,Nuget會(huì)生成一個(gè)LamondDynamicPlugin.nupkg文件,這個(gè)就是我們所說(shuō)的Nuget包了。
為了使用Nuget包的方式安裝模板,我們可以使用相同的命令dotnet new -i
dotnet new -i LamondDynamicPlugin.nupkg
當(dāng)然,通常來(lái)說(shuō)我們都會(huì)將這個(gè)Nuget包發(fā)布到nuget.org, 這樣就可以將這個(gè)模板分享給其他人了。
發(fā)布到Nuget之后,我們就可以使用LamondDynamicPlugin.nuspec中定義的唯一id來(lái)安裝模板了。安裝的命令和之前從目錄安裝模板是一樣的。
dotnet new -i LamondDynamicPlugin
如果你想卸載某個(gè)模板,只需要使用dotnet new -u [Nuget包]即可。
dotnet new -u LamondDynamicPlugin
總結(jié)
本文中我演示了如何使用dotnet-CLI創(chuàng)建一個(gè).NET
Core的項(xiàng)目模板,以及如何使用Nuget來(lái)打包項(xiàng)目模板供其他人使用,這樣就解決了我們之前手動(dòng)創(chuàng)建插件項(xiàng)目繁瑣的問(wèn)題。下一期,我會(huì)嘗試將模塊的業(yè)務(wù)邏輯抽象出來(lái),創(chuàng)建一個(gè)核心類庫(kù),大家敬請(qǐng)期待。
熱門工具 換一換
