每一個成功產品的背后至少有一個偉大的類庫,每一個偉大的類庫都歸屬於一個優秀的包包(package),每一個優秀的包包都離不開一個順手的包包管理器。而NuGet是.NET程序員首選的包包管理器。
這篇文章分享的是如何用NuGet.Server搭建自己的NuGet服務器,如何上傳包包,以及我們使用中遇到的問題與自動化打包/上傳方案。
一、NuGet服務端的搭建
准備材料:IIS + ASP.NET 4.0 + VS2010 + NuGet.Server
1. 打開VS2010,新建一個ASP.NET Empty Web Application項目

2. 通過NuGet安裝NuGet.Server


上圖中的Packages文件夾是安裝NuGet.Server時自動生成的,它就是存放包包的倉庫。
3. 在web.config > appSettings 中設置存放包包的倉庫的路徑
<appSettings> <add key="packagesPath" value="~/Packages" /> </appSettings>
4. 在web.config > appSettings 中設置apiKey,上傳包包時,需要通過這個apiKey進行驗證。
<appSettings> <add key="apiKey" value="12345trewq" /> </appSettings>
5. 在IIS中為這個項目創建一個Web站點,然后通過瀏覽器訪問,如果設置正確,會出現如下的頁面:

二、客戶端打包/上傳包包
1. 打包,也就是生成.nupkg文件
有三種方式:
a) 通過nuget pack命令
比如,我們對一個名稱為“項目A”的VS2010項目進行打包,對應的命令行是:
nuget pack 項目A.csproj -Build -Properties Configuration=Release
運行該命令后,nuget會自動調用msbuild以Release方式編譯該項目並在當前文件夾中生成“項目A.nupkg”。
b) 在Visual Studio編譯時自動打包
先要在VS2010中啟用Eable NuGet Package Restore,然后修改發布項目的.csproj文件,在PropertyGroup中添加<BuildPackage>true</BuildPackage>,如下圖:


這樣設置后,Visual Studio編譯該項目時會自動在bin文件夾中生成對應的.nupkg文件。
c) 通過msbuild命令在編譯時進行打包
比如,在命令行中運行下面的命令:
msbuild CNBlogs.Infrastructure.Logging.csproj /p:BuildPackage=true
注:通過msbuild傳參數不需要修改任何配置文件,這樣可以很方便地進行自動化。
2. 上傳至NuGet服務器
通過nuget push命令進行上傳,比如:
nuget push 項目A.nupkg -s http://nuget.cnblogs.com 12345trewq
注:項目A.nupkg是包包的名稱,http://nuget.cnblogs.com是NuGet Server網址,12345trewq是之前在web.config中設置的apiKey。
【遇到的問題】
開始時,我們執行這個命令后,出現錯誤:
Failed to process request. 'Method Not Allowed'. The remote server returned an error: (405) Method Not Allowed..
產生這個錯誤是由於IIS安裝了WebDAV模塊:

刪除WebDAV Module與WebDAV Hanlder,上傳時會返回404錯誤,通過瀏覽器訪問路徑nuget/Packages也是404錯誤。
查看IIS日志發現nuget push實際執行的是HTTP PUT操作 —— PUT /api/v2/package/,WebDAV不允許這個操作。
根據網上的說法,必須要卸載WebDAV,可是這台服務器上有一個站點需要它,后來將NuGet Server安裝到另外一台服務器解決了這個問題。
3. 打包/上傳一條龍
a) 通過批處理實現
優點:可自動化,可一次打包/上傳多個項目。
批處理示例:
nuget pack ..\CNBlogs.Domain.Core\CNBlogs.Domain.Core.csproj -Build -Properties Configuration=Release nuget pack ..\CNBlogs.Bootstrap\CNBlogs.Bootstrap.csproj -Build -Properties Configuration=Release nuget pack ..\CNBlogs.Presentation.Web\CNBlogs.Presentation.Web.csproj -Build -Properties Configuration=Release nuget push *.nupkg -s http://nuget.cnblogs.com 12345trewq
目前我們采用的就是這個方法。
b) 通過圖形界面工具NuGetPackageExplorer實現
優點:操作方便
缺點:不能一次處理多個項目,不能自動化
具體操作方法,請閱讀NuGet學習筆記(2) 使用圖形化界面打包自己的類庫
三、打包/上傳自動化的進一步解決方案
該解決方案還沒實現,這里只是分享一下我們的思路。
通過一個ASP.NET MVC程序實現,名稱叫“一鍵發包”。
操作流程:
在瀏覽器中選擇要發布至NuGet服務器的項目名稱並點擊“Push” -> 服務端自動運行Git命令從代碼庫中獲取該項目的代碼 -> 自動運行msbuild命令編譯該項目並生成.nupkg文件(msbuild projectname.csproj /p:BuildPackage=true)-> 自動運行nuget push命令發布至NuGet服務器(nuget push)。
相關鏈接:
