源文章:dax.net
http://www.cnblogs.com/daxnet/archive/2013/05/07/3064577.html
使用NuGet發布自己的類庫包(Library Package)
NuGet是一個為大家所熟知的Visual Studio擴展,通過這個擴展,開發人員可以非常方便地在Visual Studio中安裝或更新項目中所需要的第三方組件,同時也可以通過NuGet來安裝一些Visual Studio的插件等。作為一名開發人員,您可能也會開發一些公共組件以供他人使用,本文將一步步介紹如何以最簡單的方式將自己所開發的類庫包發布到nuget上,以供更多的人使用。
背景
如果你還是不知道什么是NuGet,那么就看這樣一個案例:我現在需要在我的項目中引用Castle.Core程序集,按照以往的做法,就是從Castle Projects官方網站,下載一個最新版本的dll,然后把它復制到項目的lib目錄下(或者隨便什么地方都行),這樣做不僅繁瑣,而且你需要時刻關心官網上這個程序集的最新版本信息(當然或許你也不會去關注),更煩的是,如果你是一個開源項目的Contributor,你還需要花一定的時間去管理所有的這些libs,不僅如此,如果你是使用的源代碼管理系統來管理項目源碼,比如使用git等,那你還不得不把這些libs上傳到源代碼管理系統中,否則團隊中的其他組員即使獲得了源代碼,也無法正確編譯。但這樣做又大大增加了源代碼的存儲空間,使得代碼克隆和下載都變得非常耗時。
現在,就可以直接使用NuGet來解決所有問題,我們先創建一個Class Library,命名為DaxnetNugetTest,然后在這個項目上點右鍵,選擇Manage NuGet Packages:
在彈出的對話框中,搜索Castle關鍵字,然后在搜索結果列表中選擇Castle.Core,單擊Install按鈕:
安裝完成后,Castle.Core的程序集就被引用到項目中了,同時在項目中多出了一個packages.config文件,以向NuGet表明,當前項目使用了哪些Package,版本是什么,以及是基於哪個版本的.NET Framework。
今后,如果Castle.Core程序集有版本更新,則同樣可以使用Manage NuGet Packages菜單打開上面的對話框,然后在左邊的Updates列表中,就會列出發生了版本更新的Package,如果有,則單擊Update按鈕即可更新。
更有趣的是,如果你在解決方案上點右鍵,選擇Enable NuGet Package Restore菜單,那么在你編譯項目的時候,NuGet會自動分析出你項目所依賴的第三方組件,然后在編譯開始之前會自動上網下載所需的版本,因此,你也就不要去維護這些libs了,更沒必要把這些libs也上傳到源代碼管理系統中。
不過這些也都不是本文的重點,本文的重點是,介紹如何將自己的Class Library發布到NuGet上。
發布自己的類庫包(Library Package)
STEP 1:在NuGet上注冊並獲取API Key
首先,你需要到NuGet上注冊一個新的賬號,然后在My Account頁面,獲取一個API Key,這個過程很簡單,我就不作說明了。
STEP 2:下載NuGet.exe
NuGet有個命令行工具:NuGet.exe,非常好用,不過使用之前需要下載,下載地址:http://nuget.codeplex.com/downloads/get/669083。為了方便使用,請設置機器的PATH環境變量,將NuGet.exe的路徑添加到PATH中。
STEP 3:設置API Key
使用以下命令設置NuGet API Key:
1
|
nuget setApiKey <my_api_key>
|
記得將上面的my_api_key替換為STEP 1中獲得的API Key。
STEP 4:開發自己的類庫(Class Library)
上面我們新建了一個類庫: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"
)]
|
全部設置好以后,編譯整個項目待用。
STEP 5:產生並修改nuspec
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
>
|
注意兩點:1、$description$使用AssemblyDescriptionAttribute的值進行替換,在產生package之前,一定要記得先編譯項目,否則會提示$description$找不到的錯誤;2、releaseNotes如果沒有,就直接刪掉這個節點,如果有,則填入自己的內容,不要使用默認內容,否則會在下一步產生警告信息。
STEP 6:產生類庫包(Library Package)
同樣在DaxnetNugetTest.csproj路徑下,使用下面的命令產生NuGet類庫包:
1
|
nuget pack DaxnetNugetTest.csproj
|
成功后,提示:
注意:由於我們的項目通過NuGet引用了Castle.Core,因此,它將會作為一個依賴組件(dependency)打包到產生的nupkg文件中。
另外,NuGet會使用默認的項目配置所產生的程序集進行打包。如果項目默認是Debug,而你需要用Release打包,則使用下面的命令:
1
|
nuget pack DaxnetNugetTest.csproj -Prop Configuration=Release
|
STEP 7:發布類庫包
現在,通過以下命令發布類庫包:
1
|
nuget push DaxnetNugetTest.1.0.0.0.nupkg
|
完成以后,出現以下提示:
STEP 8:測試已發布的類庫包
新建一個控制台應用程序,在項目上點右鍵,選擇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);
}
}
|
輸出如下:
STEP 9:更新類庫包
隨着類庫開發進度不斷向前,必然會有版本更新。更新類庫包很簡單,只需要在AssemblyInfo.cs中更新一下版本號,然后重新執行上面的STEP 6、7即可。注意在執行STEP 7的時候,nupkg的文件名應該使用新版本的文件名。
現在,我們重新打開DaxnetNugetTest項目,將CastleHelper類中的20,30改為40,50,然后打開AssemblyInfo.cs,版本號升級為2.0.0.0,重新編譯項目,並重新產生、發布nupkg:
再打開用來測試的控制台程序,同樣打開Manage NuGet Packages對話框,我們可以在Updates中看到,DaxnetNugetTest有了更新:
點擊Update按鈕,將類庫更新到最新版本。重新運行這個控制台程序,我們發現,輸出已經是最新版本的值了:
STEP 10:刪除已發布的包
原則上,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進行學習研究。