NuGet

【NuGet 02】將程式庫打包為 NuGet Package 並上傳至 NuGet Server

江崑成 2016/08/18 15:28:25
2451







主題

NuGet 02】將程式庫打包為 NuGet Package 並上傳至 NuGet Server

文章簡介

不論是想上傳到公開的 NuGet Server 或是想上傳到私有的 NuGet Server,都必須先學會打包 NuGet Package,本篇將說明如何快速的打包一個 NuGet Package。

作者

江崑成(Vito)

版本/產出日期

V1.0/2016.07.28




1. 前言

在【NuGet 01】篇提到如何建立 NuGet Server,但總不能沒有 NuGet Package(無魂附體親像稻草人),所以接下來要來說明如何建立一個 NuGet Package,並上傳到 NuGet Server


2. 目的

將程式庫打包成 NuGet Package 並上傳到 NuGet Server。


3. 環境準備

Visual Studio 2015

.Net Framework 4.6


4. NuGet Packager

有關如何建立並上傳 NuGet Package,在 官方文件 NuGet Doc 已有詳細說明,另外也有 GUI 工具 NuGet Package Explorer 可以使用,但畢竟只是工具且沒辦法與開發整合,在使用上還是有些不便,所以目前選擇以 Visual Studio Extension 中的 NuGet Packager 來負責打包及上傳的作業,它提供了一個 Project Template,能夠做到自動打包 NuGet Package 以及自動上傳(Release 模式)

NuGet Packager Project Template

Step 1. 先建立一個 Class Library Project,作為我們要打包的程式庫目標,取名為 TestLibrary


因為只是範例,所以不在裡面增加任何程式,我們只需要編譯完成後的 dll


Step 2. 再建立一個 NuGet Packager Project,來進行打包以及上傳,命名為 TestLibrary-PCL.nugetpackager,因為是 PCL Class Library,所以後面加上 PCL 後綴。


經測試後原本命名為 .nupkg 時,專案下的所有檔案都會被 .gitignore 檔案排除,所以改為命名 .nugetpackager 作為辨識,圖片的話就不重新截圖了!


專案結構說明

上面二個步驟建立完成後的專案架構如下:


contentlibsrc_tools 都是 NuGet 不同用途的資料夾,tools 裡面也包含了init.ps1install.ps1uninstall.ps1等安裝及解除安裝的 Script 範本(PowerShell)

詳細說明可參考下方截圖或是直接連至官網 查看


Package.nuspec

比較重要的是 Package.nuspec 檔,裡面定義了一些 NuGet Package 資訊包含 idversiontitleauthorsdescriptionsummaryprojectUrliconUrllicenseUrl...等。

其中包含了元件的 dependency,不過我們的元件並沒有與其他 Package 相依,所以不需要 dependencies 的內容。


另外就是要被打包的檔案,預設會將 contentlibtools 下的檔案進行打包,在本次範例中,我們加入下面這行設定,將 TestLibrary dll 也打包進來。


完成後的設定如下:


當設定修改完成後,以 Debug 的模式進行編譯,相關檔案就會被打包成 NuGet Package,並放在專案根目錄底下。本範例的檔案為「TestLibrary_PCL.1.0.0.nupkg」。


若無法正常編譯,請將專案的 Target Framework 改為 .Net Framework 4.5 以上即可正常編譯。


5. Push NuGet Package

打包好的 NuGet Package 可以選擇透過手動的方式上傳,不過選擇使用 NuGet Packager 的好處,就是可以幫我們做到自動上傳,而且只需二個步驟。


Step 1. Set apiKey

因為在 NuGet Server 有設定必須要有 apiKey 才可進行上傳,所以在上傳前我們必須先將 apkKey 設定到 Config 中,NuGet Packager 的自動上傳才會成功。

根據黑大的說明 ,有二種做法:


第一種是透過 setApiKey apiKey 加密儲存在目前帳號的 %appdata%\NuGet\NgGet.config 中,之後上傳至 NuGet Server 時,就會自動引用


command 指令如下:


第二種作法是將 apiKey 寫入到 NuGet Packager 專案的 nuget.config 中。

但由於 NuGet 採取加密後儲存,所以一樣要先用第一種方式將 apiKey 設定完成後,再從 %appdata%\NuGet\NgGet.config 中取得加密後的 apiKey


NuGet config 檔加密時用的是使用者專屬加密金鑰,故無法在多開發者間共享 API Key 設定


Step 2. 這邊使用的是 Step 1 中的第一種方式,設定後修改 nuget.config,增加 NuGet Server 的網址


Step 3. 接著將專案改為 Release 模式並進行編譯,即可將 NuGet Package 上傳到我們的 NuGet Server 囉。


6. Add NuGet Package Source

最後透過 Visual Studio NuGet package Manager 增加 Package Sources


Name 可以自行命名,Source 就是 NuGet Server 的網址,最後按「Update」及「OK」即可完成設定。


就可以看到我們上傳的 NuGet Package 囉。


7. 其他

.gitignore

因為 NuGet Packager 會用到 NuGet.exe,但 git 會自動將 exe 排除在外不進版控,所以需要在在 .gitignore 最後面增加下列設定,排除所有 exe 檔案,但不排除 NuGet.exe


NuGet 指令

nuget.exe setApiKey apiKey -Source http://internal-nuget-server.azurewebsites.net/api/v2/package


nuget delete packageId -ApiKey apiKey -NonInteractive -Source http://internal-nuget-server.azurewebsites.net/api/v2/package


8. 參考來源

Nuget 官方網站

Visual Studio 發布 NuGet Package 的好幫手 - NuGet Packager


江崑成