寫這篇文章的原因是我在學習構建nuget包的時候,發現了一個官方推薦的GUI工具,而官方的工具介紹文章已經過時,一些地方和現在最新版本的工具有些差異,所以特意利用假期最后一個下午寫下來,希望能幫助更多的人。畢竟,在我看來,從事..NET開發的很多朋友,並不是特別迷戀命令行這種看起來高大上但是實際上並沒有高效可言的東西(起碼在Windows平台上是這樣吧)
下載與安裝
您可以導航到這里下載並在線安裝這個工具包,我目前沒有找到離線安裝包,但是索性codeplex不像nuget那么慘,時不時的被…是吧,你懂的!
在安裝完成后第一次啟動,會檢測你使用的是不是windows8系統,如果是會推薦你另外一個windows8應用,當然我個人並不習慣於使用windows8應用在開發機器上(我主要工作也不是開發windows8應用),所以這篇文章將使用最新版本的win32應用做介紹!
起始界面如下所示,比官方文檔上那一個版本要酷炫多了,但是不止於酷炫哦
創建nuget工具包
豐富包的基礎信息
在點擊Create a new package后,是一個簡潔的界面
左邊部分,可以錄入一些包中的基礎信息,包括:
包的ID:必須的唯一的ID,格式和C#命名空間規范相同,在你發布包的時候會去驗證唯一性。
版本號:必須的三段式的版本號,注意每次發布必須大於上一次的版本號,否則將會被nuget駁回。
標題:非必需的,通常你可以讓它和ID保持一致,但是這不是強制的。
作者(s):必須的項目,以逗號分隔作者列表。
擁有者:你可以隨便寫,但是在發布的時候會被你的nuget帳戶名替代。
最低客戶端版本:描述這個包限制的最低nuget客戶端版本。
iconUrl:一個32*32像素的.png文件地址,作為最終在nuget中顯示的圖標
描述、標簽、許可地址、項目地址,是否強制需要同意許可,這些都一目了然了,不多做介紹。
最后有兩項特別重要了;
Dependencies:依賴,這個包是否依賴其它的包,當然你可以把依賴的其他包直接拷貝包含進來,但是這就完全違背了nuget的初衷,如果你所依賴的項目沒有nuget包,你可以聯系原作者后者幫助打包為nuget包。
Framework Assenbly Reference:這里描述了在安裝這個包時會被同時引用的程序集,你可以按照不同的.NET Framework版本區分指定它們。下面給出我自己的包的一個示例:
添加要包含的文件
在最終的nuspec文件中,可以通過設置files的xml節點來逐個指定要包含的文件,但是這樣nuget就會完全忽略按照文檔結構的約定包含的文件,在大多數情況下,我們不需要去手動指定它,但是在一些特殊的場合,你可能需要使用到它。
files節點可以包含file子節點,它包含src和target兩個屬性,來分別制定要包含的文件路徑和目標路徑,在src中還可以使用*和**通配符,想要了解更詳細的說明,請參閱http://docs.nuget.org/docs/reference/nuspec-reference.
在nuget文檔結構約定中,包含了如下三個文件夾:
lib:包含目標程序將要引用的dll文件。
content:將按照文檔結構復制到應用程序根目錄中的靜態文件,但是如果文件中包含了擴展名是.pp或者transform,那么在將會轉換目標文件。
tools:在解決方案或者項目中包含的一些powershell腳本,以及一些可以在Nuget package console中訪問的應用程序。(您記得安裝完entity framework后的add-migration命令吧,就是由這里提供的),但是powershell的編寫已經超出了本文的范圍,如果您想了解詳細情況,請google之。
在本文示例中,創建了content和lib文件夾
在lib文件夾中,我們可以指令在不同的.net framework版本中,要包含的不同文件的引用,我們可以在任意目錄中包含它們,而並不只是在lib文件夾中。
而在添加這些文件夾的時候,可以通過右鍵點擊文件夾,然后選擇Add .NET Folder快速的添加不同版本名字縮寫的文件夾,這是你使用命令行方式創建nuget包所享受不到的快捷的方式,很酷吧。GUI工具還提供了很多快捷的方式,有待各自探索了。
上文中提到過,黨Content文件夾中包含了后綴名為.transform的文件時,nuget將會merge目標文件,比如示例中使用的就是一個ASP.NET MVC擴展的包,它可以提供給ASP.NET MVC生成多選列表和單選列表的HtmlHelper(盡管把這個看成一個硬廣吧,地址),所以,我們需要在Visual studio添加這個包的時候,給MVC項目的Views目錄下的web.config文件加一個HtmlHelper需要的命名空間記錄,所以我編寫了如下內容的web.config.transform存放到content/Views目錄下
<?xml version="1.0"?>
<configuration>
<system.web.webPages.razor>
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="ListControl.Extension"/>
</namespaces>
</pages>
</system.web.webPages.razor>
</configuration>
當然你也可以定義一些后綴為.pp的文件,來按一定規則生成代碼,而且它還可以使用一些預定義的變量,會提供你生成專用於目標項目代碼的有效工具。您可以在這里找到更詳細的信息。
發布包
最后,使用GUI工具發布包當然是簡單的令人發指了,點擊工具欄中的File->publish就可以簡單的發布你定義的包了,Puslish key來自於你的nuget賬戶的個人信息頁面
使用包
在VS中創建一個項目,打開nuget package窗口,在搜索框中輸入上文中定義的包ID:ListControlExtension或者直接在命令行工具中輸入命令:Install-Package ListControlExtension,就可以安裝並且使用這個擴展了.
上文中的包使用效果:
View文件代碼:
<div class="form-group">
@Html.LabelFor(model => model.Departments, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.CheckBoxListFor(model => model.Departments, Model.AllDepartmemtns)
@Html.ValidationMessageFor(model => model.Departments, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Gender, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.RadioButtonListFor(model => model.Gender, Model.GenderCollection,"myCustomStyle")
@Html.ValidationMessageFor(model => model.Departments, "", new { @class = "text-danger" })
</div>
</div>
.
結束語
怎么樣?這個GUI工具是不是提供了很多的便捷?(怎么樣?這個廣告硬的可以把?),如果您喜歡這篇文章,記得在右下角給個“推薦”哦,如果您對上文中的廣告的使用效果有什么意見和建議,請不吝拍磚,謝謝