AppVeyor で NuGet パッケージの作成とデプロイを自動化

.NET 特化の CI サービス、AppVeyor を使って、ライブラリなどの C# プロジェクトを NuGet パッケージ化し NuGet Gallery にデプロイするところまでを自動化できます。

以前、@tanaka_733 先生が同様の記事を書かれていますが、その後 AppVeyor の機能が強化され、NuGet への push をより簡単に実施できるようになりました。

AppVeyor そのものについては、前述の @tanaka_733 先生の記事 か、@Posaune 先生の記事 が詳しいです。

.nuspec ファイルの配置

パッケージ マニフェストである .nuspec ファイルは、パッケージ化するプロジェクトの直下に、.csproj と同じ名前で作成し配置しておきます。 この状態で GitHub に push しましょう。

.nuspec

そして、AppVeyor の SETTINGS > Build から、Package NuGet projects にチェックを入れます。 これで、ビルド時に .csproj と同名の .nuspec が存在する場合、そのプロジェクトごとに自動的にパッケージを作成 (nuget pack) してくれるようになります。

Package NuGet projects

NuGet Gallery へのデプロイ

ビルド時に自動的に作成された .nupkg を、更に自動的に NuGet Gallery に push します。 AppVeyor の SETTINGS > Deployment から Add deployment をクリックし、provider として NuGet を選択しましょう。

Deployment

埋める必要があるのは、API key のボックスだけです。 https://www.nuget.org/account の Credentials にある API Key をコピペすれば OK。

Artifact(s) ボックスには push するファイル名または AppVeyor の artifact 名を指定しますが、空欄にしておけばビルド時に自動生成された .nupkg ファイルをすべて push してくれます。

また、もし NuGet Gallery 以外の別の NuGet サーバーへデプロイしたい場合は、その URL を NuGet server ボックスで指定しましょう。

バージョン管理

NuGet パッケージにはバージョンを指定する必要があり、同じバージョンのまま AppVeyor で push してしまうと怒られます。 (ついでに、AppVeyor のビルドも失敗扱いになります)

error

NuGet パッケージを自動生成する際に、バージョン番号も自動的に設定する方法を 2 種類紹介します。

その 1: AssemblyInfo のバージョン番号を使う

.nuspec ファイルには、パッケージ作成時にアセンブリ メタデータを読み取って .nuspec ファイルにマージする機能があります。

トークン プレースホルダー値の取得元
$id$ アセンブリ名
$title$ AssemblyTitleAttribute で指定しているアセンブリのタイトル
$version$ AssemblyVersionAttribute で指定しているアセンブリのバージョン
$author$ AssemblyCompanyAttribute で指定している企業
$descriptions$ AssemblyDescriptionAttribute で指定している説明

引用元: http://msdn.microsoft.com/ja-jp/magazine/hh547106.aspx

今回の場合、.nuspec ファイルにバージョン番号として以下のように記述しておけば、パッケージ作成の際に AssemblyInfo のバージョン番号が使用されるようになります。

そして、AppVeyor でのビルド時に、AssemblyInfo を AppVeyor のビルド番号で上書きする設定をします。 SETTINGS > General から、AssemblyInfo patching を ON にしましょう。

AssemblyInfo patching

  1. ビルド時に AssemblyInfo のバージョン番号が AppVeyor のビルド番号で上書き
  2. .nuspec が上書きされた AssemblyInfo のバージョン番号を使用して .nupkg を作成

という流れになり、ビルドごとに異なるバージョンの NuGet パッケージを push できるようになります。

また、AppVeyor のビルド番号は、同じページの Build version format から設定できます。 バージョン番号が AssemblyInfo.cs と AppVeyor の Build version format で二重管理になってしまうところが若干びみょいですが、仕方なし。

その 2: ビルド前スクリプトで自分で上書き

何らかの理由 (たとえば、AssemblyInfo.cs を AppVeyor のビルド番号で上書きしたくないときとか) で上記の方法を使えない場合、ビルド直前に git clone した .nuspec ファイルを自分で上書きするという手段があります。

SETTINGS > Build から、Before build script を PS に設定し、以下のような PowerShell スクリプトを記述します。
(修正: PowerShell のこわいひとがカッコイイ書き方教えてくださいました)

APPVEYOR_BUILD_FOLDER と APPVEYOR_BUILD_VERSION は AppVeyor 固有の環境変数です (一覧)。 git clone したフォルダー以下の .nuspec ファイルすべてに対して、metadata の version タグを AppVeyor のビルド番号で上書きしています。

これで、ビルドごとに異なるバージョンの .nupkg ファイルを作成し push できるようになります。 こっちの方法は、アセンブリのバージョンと NuGet パッケージのバージョンが異なるという状況になるので、これまた若干びみょいですが、お好きな方法を選択してくだされば。


One thought on “AppVeyor で NuGet パッケージの作成とデプロイを自動化

  1. Pingback: ウィンドウの枠を簡単に光らせるライブラリを公開しました | grabacr.nét

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です