.NET 特化の CI サービス、AppVeyor を使って、ライブラリなどの C# プロジェクトを NuGet パッケージ化し NuGet Gallery にデプロイするところまでを自動化できます。
以前、@tanaka_733 先生が同様の記事を書かれていますが、その後 AppVeyor の機能が強化され、NuGet への push をより簡単に実施できるようになりました。
AppVeyor そのものについては、前述の @tanaka_733 先生の記事 か、@Posaune 先生の記事 が詳しいです。
.nuspec ファイルの配置
パッケージ マニフェストである .nuspec ファイルは、パッケージ化するプロジェクトの直下に、.csproj と同じ名前で作成し配置しておきます。
この状態で GitHub に push しましょう。
そして、AppVeyor の SETTINGS > Build から、Package NuGet projects にチェックを入れます。
これで、ビルド時に .csproj と同名の .nuspec が存在する場合、そのプロジェクトごとに自動的にパッケージを作成 (nuget pack) してくれるようになります。
NuGet Gallery へのデプロイ
ビルド時に自動的に作成された .nupkg を、更に自動的に NuGet Gallery に push します。
AppVeyor の SETTINGS > Deployment から Add deployment をクリックし、provider として NuGet を選択しましょう。
埋める必要があるのは、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 のビルドも失敗扱いになります)
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 のバージョン番号が使用されるようになります。
1 2 3 |
そして、AppVeyor でのビルド時に、AssemblyInfo を AppVeyor のビルド番号で上書きする設定をします。
SETTINGS > General から、AssemblyInfo patching を ON にしましょう。
- ビルド時に AssemblyInfo のバージョン番号が AppVeyor のビルド番号で上書き
- .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 のこわいひとがカッコイイ書き方教えてくださいました)
1 2 3 4 5 |
(ls $env:APPVEYOR_BUILD_FOLDER -Recurse).Where{ $_.Extension -eq ".nuspec" }.ForEach{ [xml]$xml = Get-Content $_.FullName $xml.package.metadata.version = $env:APPVEYOR_BUILD_VERSION $xml.Save($_.FullName) } |
APPVEYOR_BUILD_FOLDER と APPVEYOR_BUILD_VERSION は AppVeyor 固有の環境変数です (一覧)。
git clone したフォルダー以下の .nuspec ファイルすべてに対して、metadata の version タグを AppVeyor のビルド番号で上書きしています。
これで、ビルドごとに異なるバージョンの .nupkg ファイルを作成し push できるようになります。
こっちの方法は、アセンブリのバージョンと NuGet パッケージのバージョンが異なるという状況になるので、これまた若干びみょいですが、お好きな方法を選択してくだされば。
Pingback: ウィンドウの枠を簡単に光らせるライブラリを公開しました | grabacr.nét