源文章:dax.nethtml
http://www.cnblogs.com/daxnet/archive/2013/05/07/3064577.htmlgit
NuGet是一個爲你們所熟知的Visual Studio擴展,經過這個擴展,開發人員能夠很是方便地在Visual Studio中安裝或更新項目中所須要的第三方組件,同時也能夠經過NuGet來安裝一些Visual Studio的插件等。做爲一名開發人員,您可能也會開發一些公共組件以供他人使用,本文將一步步介紹如何以最簡單的方式將本身所開發的類庫包發佈到nuget上,以供更多的人使用。shell
若是你仍是不知道什麼是NuGet,那麼就看這樣一個案例:我如今須要在個人項目中引用Castle.Core程序集,按照以往的作法,就是從Castle Projects官方網站,下載一個最新版本的dll,而後把它複製到項目的lib目錄下(或者隨便什麼地方都行),這樣作不只繁瑣,並且你須要時刻關心官網上這個程序集的最新版本信息(固然或許你也不會去關注),更煩的是,若是你是一個開源項目的Contributor,你還須要花必定的時間去管理全部的這些libs,不只如此,若是你是使用的源代碼管理系統來管理項目源碼,好比使用git等,那你還不得不把這些libs上傳到源代碼管理系統中,不然團隊中的其餘組員即便得到了源代碼,也沒法正確編譯。但這樣作又大大增長了源代碼的存儲空間,使得代碼克隆和下載都變得很是耗時。apache
如今,就能夠直接使用NuGet來解決全部問題,咱們先建立一個Class Library,命名爲DaxnetNugetTest,而後在這個項目上點右鍵,選擇Manage NuGet Packages:api
在彈出的對話框中,搜索Castle關鍵字,而後在搜索結果列表中選擇Castle.Core,單擊Install按鈕:服務器
安裝完成後,Castle.Core的程序集就被引用到項目中了,同時在項目中多出了一個packages.config文件,以向NuGet代表,當前項目使用了哪些Package,版本是什麼,以及是基於哪一個版本的.NET Framework。工具
從此,若是Castle.Core程序集有版本更新,則一樣可使用Manage NuGet Packages菜單打開上面的對話框,而後在左邊的Updates列表中,就會列出發生了版本更新的Package,若是有,則單擊Update按鈕便可更新。post
更有趣的是,若是你在解決方案上點右鍵,選擇Enable NuGet Package Restore菜單,那麼在你編譯項目的時候,NuGet會自動分析出你項目所依賴的第三方組件,而後在編譯開始以前會自動上網下載所需的版本,所以,你也就不要去維護這些libs了,更不必把這些libs也上傳到源代碼管理系統中。學習
不過這些也都不是本文的重點,本文的重點是,介紹如何將本身的Class Library發佈到NuGet上。測試
首先,你須要到NuGet上註冊一個新的帳號,而後在My Account頁面,獲取一個API Key,這個過程很簡單,我就不做說明了。
NuGet有個命令行工具:NuGet.exe,很是好用,不過使用以前須要下載,下載地址:http://nuget.codeplex.com/downloads/get/669083。爲了方便使用,請設置機器的PATH環境變量,將NuGet.exe的路徑添加到PATH中。
使用如下命令設置NuGet API Key:
1
|
nuget setApiKey <my_api_key>
|
記得將上面的my_api_key替換爲STEP 1中得到的API Key。
上面咱們新建了一個類庫:DaxnetNugetTest,並經過NuGet添加了對Castle.Core的引用,如今咱們添加一些代碼,來使用Castle.Core所提供的一些功能。咱們將Class1.cs更名爲CastleHelper.cs,此時也會將Class1類更名爲CastleHelper。在CastleHelper.cs中寫入如下代碼:
1
2
3
4
5
6
7
|
public
class
CastleHelper
{
public
static
Castle.Core.Pair<
int
,
int
> GetIntPair()
{
return
new
Castle.Core.Pair<
int
,
int
>(20, 30);
}
}
|
而後,打開AssemblyInfo.cs文件,將assembly的屬性設置好,記得再設置一下AssemblyVersion特性,以指定咱們類庫的版本。目前咱們使用1.0.0.0版本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[assembly: AssemblyTitle(
"DaxnetNugetTest"
)]
[assembly: AssemblyDescription(
"Daxnet's test of the NuGet."
)]
[assembly: AssemblyConfiguration(
""
)]
[assembly: AssemblyCompany(
"daxnet"
)]
[assembly: AssemblyProduct(
"DaxnetNugetTest"
)]
[assembly: AssemblyCopyright(
"Copyright © daxnet 2013"
)]
[assembly: AssemblyTrademark(
""
)]
[assembly: AssemblyCulture(
""
)]
[assembly: ComVisible(
false
)]
[assembly: Guid(
"20662b9f-91de-4515-9c8c-ced3d61589e1"
)]
[assembly: AssemblyVersion(
"1.0.0.0"
)]
|
所有設置好之後,編譯整個項目待用。
nuspec是NuGet將項目打包成nupkg的輸入文件,能夠經過nuget spec命令產生。在命令提示符下,進入DaxnetNugetTest.csproj文件所在目錄,而後執行:
1
|
nuget spec
|
此時會提示建立成功:
用notepad打開DaxnetNugetTest.nuspec文件,把須要替換的信息替換掉,不須要的tag所有刪掉,注意裏面的$xxx$宏,這些就是引用了AssemblyInfo.cs中的設置值,在編譯產生package的時候,會使用AssemblyInfo.cs中的相應值進行替換。完成編輯後,咱們的nuspec文件以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?
xml
version="1.0"?>
<
package
>
<
metadata
>
<
id
>$id$</
id
>
<
version
>$version$</
version
>
<
title
>$title$</
title
>
<
authors
>$author$</
authors
>
<
owners
>$author$</
owners
>
<
licenseUrl
>http://www.apache.org/licenses/LICENSE-2.0.html</
licenseUrl
>
<
projectUrl
>http://apworks.org</
projectUrl
>
<
requireLicenseAcceptance
>false</
requireLicenseAcceptance
>
<
description
>$description$</
description
>
<
releaseNotes
>First release</
releaseNotes
>
<
copyright
>Copyright 2013</
copyright
>
</
metadata
>
</
package
>
|
注意兩點:一、$description$使用AssemblyDescriptionAttribute的值進行替換,在產生package以前,必定要記得先編譯項目,不然會提示$description$找不到的錯誤;二、releaseNotes若是沒有,就直接刪掉這個節點,若是有,則填入本身的內容,不要使用默認內容,不然會在下一步產生警告信息。
一樣在DaxnetNugetTest.csproj路徑下,使用下面的命令產生NuGet類庫包:
1
|
nuget pack DaxnetNugetTest.csproj
|
成功後,提示:
注意:因爲咱們的項目經過NuGet引用了Castle.Core,所以,它將會做爲一個依賴組件(dependency)打包到產生的nupkg文件中。
另外,NuGet會使用默認的項目配置所產生的程序集進行打包。若是項目默認是Debug,而你須要用Release打包,則使用下面的命令:
1
|
nuget pack DaxnetNugetTest.csproj -Prop Configuration=Release
|
如今,經過如下命令發佈類庫包:
1
|
nuget push DaxnetNugetTest.1.0.0.0.nupkg
|
完成之後,出現如下提示:
新建一個控制檯應用程序,在項目上點右鍵,選擇Manage NuGet Packages,在搜索框中輸入DaxnetNugetTest,此時咱們發佈的Package已經能夠顯示了:
單擊Install按鈕,NuGet會自動分析組件依賴關係,而後把所須要的全部程序集都下載下來並添加到項目引用中:
寫一點代碼來測試:
1
2
3
4
5
6
7
8
9
|
class
Program
{
static
void
Main(
string
[] args)
{
var
pair = DaxnetNugetTest.CastleHelper.GetIntPair();
Console.WriteLine(pair.First);
Console.WriteLine(pair.Second);
}
}
|
輸出以下:
隨着類庫開發進度不斷向前,必然會有版本更新。更新類庫包很簡單,只須要在AssemblyInfo.cs中更新一下版本號,而後從新執行上面的STEP 六、7便可。注意在執行STEP 7的時候,nupkg的文件名應該使用新版本的文件名。
如今,咱們從新打開DaxnetNugetTest項目,將CastleHelper類中的20,30改成40,50,而後打開AssemblyInfo.cs,版本號升級爲2.0.0.0,從新編譯項目,並從新產生、發佈nupkg:
再打開用來測試的控制檯程序,一樣打開Manage NuGet Packages對話框,咱們能夠在Updates中看到,DaxnetNugetTest有了更新:
點擊Update按鈕,將類庫更新到最新版本。從新運行這個控制檯程序,咱們發現,輸出已是最新版本的值了:
原則上,NuGet不容許用戶刪除已發佈的包,而只能將其設置爲不顯示在Manage NuGet Packages的列表中。打開www.nuget.org,用已註冊的帳戶登陸後,能夠在My Account頁面選擇Manage My Packages連接進入管理頁面:
進入後,能夠看到咱們已發佈的Packages:
點擊DaxnetNugetTest左邊的小垃圾桶圖標,便可進入Listing頁面,頁面中咱們也能看到「Permanently deleting packages is not supported」的提示。要將Package從Package List中移除,只須要去掉List DaxnetNugetTest 2.0.0.0 in search results選項前面的鉤鉤,而後單擊Save按鈕保存便可:
本文簡要介紹了NuGet的使用,並介紹了一種將本身開發的類庫以NuGet Package的方式發佈到NuGet服務器的簡單方法。NuGet功能很是強大,有興趣的朋友能夠上www.nuget.org進行學習研究。