[Visual Studio] NuGet發佈自定義包(Library Package) 使用NuGet發佈本身的類庫包(Library Package)

源文章:dax.nethtml

http://www.cnblogs.com/daxnet/archive/2013/05/07/3064577.htmlgit

使用NuGet發佈本身的類庫包(Library Package)

 

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

image

在彈出的對話框中,搜索Castle關鍵字,而後在搜索結果列表中選擇Castle.Core,單擊Install按鈕:服務器

image

安裝完成後,Castle.Core的程序集就被引用到項目中了,同時在項目中多出了一個packages.config文件,以向NuGet代表,當前項目使用了哪些Package,版本是什麼,以及是基於哪一個版本的.NET Framework。工具

從此,若是Castle.Core程序集有版本更新,則一樣可使用Manage NuGet Packages菜單打開上面的對話框,而後在左邊的Updates列表中,就會列出發生了版本更新的Package,若是有,則單擊Update按鈕便可更新。post

更有趣的是,若是你在解決方案上點右鍵,選擇Enable NuGet Package Restore菜單,那麼在你編譯項目的時候,NuGet會自動分析出你項目所依賴的第三方組件,而後在編譯開始以前會自動上網下載所需的版本,所以,你也就不要去維護這些libs了,更不必把這些libs也上傳到源代碼管理系統中。學習

image

不過這些也都不是本文的重點,本文的重點是,介紹如何將本身的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

此時會提示建立成功:

image

用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若是沒有,就直接刪掉這個節點,若是有,則填入本身的內容,不要使用默認內容,不然會在下一步產生警告信息。

STEP 6:產生類庫包(Library Package)

一樣在DaxnetNugetTest.csproj路徑下,使用下面的命令產生NuGet類庫包:

1
nuget pack DaxnetNugetTest.csproj

成功後,提示:

image

注意:因爲咱們的項目經過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

完成之後,出現如下提示:

image

STEP 8:測試已發佈的類庫包

新建一個控制檯應用程序,在項目上點右鍵,選擇Manage NuGet Packages,在搜索框中輸入DaxnetNugetTest,此時咱們發佈的Package已經能夠顯示了:

SNAGHTMLecfd75

單擊Install按鈕,NuGet會自動分析組件依賴關係,而後把所須要的全部程序集都下載下來並添加到項目引用中:

image

寫一點代碼來測試:

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);
     }
}

輸出以下:

image

STEP 9:更新類庫包

隨着類庫開發進度不斷向前,必然會有版本更新。更新類庫包很簡單,只須要在AssemblyInfo.cs中更新一下版本號,而後從新執行上面的STEP 六、7便可。注意在執行STEP 7的時候,nupkg的文件名應該使用新版本的文件名。

如今,咱們從新打開DaxnetNugetTest項目,將CastleHelper類中的20,30改成40,50,而後打開AssemblyInfo.cs,版本號升級爲2.0.0.0,從新編譯項目,並從新產生、發佈nupkg:

image

再打開用來測試的控制檯程序,一樣打開Manage NuGet Packages對話框,咱們能夠在Updates中看到,DaxnetNugetTest有了更新:

image

點擊Update按鈕,將類庫更新到最新版本。從新運行這個控制檯程序,咱們發現,輸出已是最新版本的值了:

image

STEP 10:刪除已發佈的包

原則上,NuGet不容許用戶刪除已發佈的包,而只能將其設置爲不顯示在Manage NuGet Packages的列表中。打開www.nuget.org,用已註冊的帳戶登陸後,能夠在My Account頁面選擇Manage My Packages連接進入管理頁面:

image

進入後,能夠看到咱們已發佈的Packages:

image

點擊DaxnetNugetTest左邊的小垃圾桶圖標,便可進入Listing頁面,頁面中咱們也能看到「Permanently deleting packages is not supported」的提示。要將Package從Package List中移除,只須要去掉List DaxnetNugetTest 2.0.0.0 in search results選項前面的鉤鉤,而後單擊Save按鈕保存便可:

image

總結

本文簡要介紹了NuGet的使用,並介紹了一種將本身開發的類庫以NuGet Package的方式發佈到NuGet服務器的簡單方法。NuGet功能很是強大,有興趣的朋友能夠上www.nuget.org進行學習研究。

相關文章
相關標籤/搜索