標題:從零開始實現ASP.NET Core MVC的外掛式開發(二) - 如何建立專案模板
作者:Lamond Lu
地址:https://www.cnblogs.com/lwqlun/p/11155666.html
原始碼:https://github.com/lamondlu/DynamicPlugins
在上一篇中,我們介紹了通過一個最簡單了例子,給大家演示了一下,如何在ASP.NET Core Mvc中藉助ApplicationPart來開發一個外掛。在文章的最後,我們也提出了一些待解決的問題。
首先呢,第一個要解決問題是,每次我們建立一個新的外掛,每次都要重新建立專案,新增類庫引用,以及手動修改 csproj 檔案,非常的繁瑣。那麼有沒有一種方式可以減少這部分操作的?
回想一下,當我們每次使用 Visual Studio建立專案的時候,我們都可以選擇一個專案模板,Visual Studio不僅可以根據我們選擇的模板建立出專案,而且我們所需的程式集引用都會預先配置好,不需要我們重複配置了。那麼我們是否可以自己建立一些模板呢?答案是肯定的。
本文中,我就來給大家演示一下,在如何為.NET Core專案建立專案模板,簡化操作流程。
編寫template.json
如果要建立一個專案模板,我們需要做2件事情。
- 建立一份專案程式碼作為模板
- 編寫template.json檔案
這裡我們之前已經建立了一個DemoPlugin1的專案了,所以這次我們可以直接將其轉換成一個模板專案。
首先我們在當前專案中新增一個 .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
}
配置說明:
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>
使用dotnet-CLI建立模板
編寫完程式碼之後,我們就可以使用如下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包供其他人使用。
如果要建立一個模板,這裡首先我們需要建立一個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來打包專案模板供其他人使用,這樣就解決了我們之前手動建立外掛專案繁瑣的問題。下一期,我會嘗試將模組的業務邏輯抽象出來,建立一個核心類庫,大家敬請期待。