[Visual Studio]NuGet03-佈署套件到NuGet Server-使用類別庫專案

前一篇介紹使用NuGet Package Explorer 來打包套件,但實際使用上我們的套件可能是來自類別庫程式碼,如果在程式碼撰寫完建置完成之後幫我們直接打包成套件上傳到NuGet Server,使用上比較方便,也不用每一次建置完都要去操作GUI打包,省下不少麻煩

本文範例使用Visual Studio 2017

由於在Visual Studio 2015 時有支援NuGet Project Template,但在2017我沒有找到,如果有更新的話再請跟我說

下載 NuGet Command Line(CLI)工具

NuGet Command Line(CLI) - 按此下載

存在任何一個資料夾(範例中我放至C:\Nuget)

設定環境變數,路徑為剛剛上一步的資料夾(範例中我放至C:\Nuget)

在命令提示字元輸入nuget,有跑出相關指令就表示設定完成

使用指令建立.nuspec檔

NuGet 指令參考

接著在專案目錄下,使用NuGet指令建立.nuspec檔,這個是套件的描述檔,其實就是前一篇用GUI設定的那些東西,只不過這邊改用設定檔的方式設定

產生.nuspec檔


加入至專案

.nuspec檔案結構描述

可參考nuspec.xsd結構描述

.nuspec檔案設定

詳細設定可參考nuspec檔案設定

剛剛用指令產生的檔案有幾個保留字要注意一下(以$$包住的變數)
這些變數會對應至專案的AssemblyInfo.cs內的設定,在打包套件的時候會自動套用這些設定

變數 對應AssemblyInfo.cs
id 專案組態設定的組件名稱(Assembly Name)
version 先對應AssemblyInformationalVersion,如果沒有,對應AssemblyVersion
author AssemblyCompany
description AssemblyDescription
copyright AssemblyCopyright
configuration 打包時可以設定組態,透過組態打包不同的檔案

加入要打包的檔案

沿用前一篇的類別庫專案,在nuspec檔中,加入參考檔案設定,為類別庫專案編譯好的dll

<files>
      <file src="..\Bryan.Utility\bin\Debug\Bryan.Utility.*" target="lib" />
</files>

使用Automatic Versions設定版號

安裝Automatic Versions - 按此下載

使用方式請看Demo大的部落格

設定好之後,現在建置之後就會自動產生新版號,這樣做的用意是讓類別庫專案在建置完之後打包套件會套用最新的版號

設定建置完成後打包套件並上傳

在這邊我設定的情境是Debug組態時只幫我建立nupkg,只有在release版本再幫我上傳到NuGet Server上

所以我設定分別設定Debug與Release的建置後事件,需要手動編輯專案檔

在專案上按右鍵卸載專案後,再進入編輯專案

加入以下這些設定

nuget pack -Properties Configuration=$(Configuration) 

可以設定組態名稱,對應到.nuspec的configuration變數

nuget push "$(AssemblyName).*.nupkg" apiKey -source hostServer
  • $(AssemblyName).*.nupkg :打包完成的.nupkg檔名
  • apiKey:NuGet Server 的 apiKey
  • Source:NuGet Server位置

PS.我找不到MSBuild取得組件版號的指令,所以Release的時候將全部刪掉.nupkg之後再push,如果有知道的讀者再請分享給我,感謝

Debug組態時:

Release組態時:

在Release組態,如果程式碼沒有更動,直接建置會失敗,原因是版號沒有更新,而NuGet CLI嘗試幫你推上NuGet Server,版號重覆會發生錯誤,這時只要重建專案產生新版號就可以了

結語

透過NuGet CLI提供的指令,以及調整一下專案設定,就可以讓開發人員方便的去打包與佈署我們自己開發的套件,再也不需要去用惱人的GUI每一次都要打包了。

我的使用經驗是打包與佈署套件是交由Jenkins來做,同時也可以加入unit test,建置與測試都通過之後才會佈署到NuGet Server上,之後會再介紹如何在Jenkins上打包與佈署套件

參考來源

Demo - Automatic Versions 別再手動改版本號了