<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      標(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)期待。

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問(wèn)題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          就要干逼网站 | 淫香淫色视频免费播放 | 久久国产麻豆 | 欧美精品欧美精品系列 | 小坏蛋好大好涨爽飞了 | 又粗又大又爽视频 | 技师揉着揉着就进去了 | www.99精品 | 咸湿房东偷窥女浴池洗澡 | 伊人综合久久 |