Roslyn の Analyzer を AppVeyor で NuGet へデプロイするときにハマったところ

Visual Studio に “.NET Compiler Platform SDK” を導入すると、 “Analyzer with Code Fix” というテンプレートが追加されます。このテンプレートを使うと、簡単に Analyzer を作ることができます。

デプロイまでの自動化についてはこちらのページが詳しいのですが、Analyzerのテンプレートの場合には少し勝手が違うようで、この記事はそこを解決しようとするものです。

※記事投稿時点での方法です。処置が必要で無くなる可能性や使えなくなる可能性があります。

C# 6.0 の機能が使えない

Analyzer では、 nameof 演算子を使う機会が多くなるかと思います。しかし、何も設定をせずにビルドさせると、 C# 6.0 ではコンパイルしてくれません。

C# 6.0 でコンパイルさせるには、 GUI 設定では “SETTINGS” の “Environment” にある “Operating System” で "Visual Studio 2015″ を選択します。 ‘appveyor.yml’ の中では os: Visual Studio 2015 と設定します。

依存する NuGet パッケージの解決・復元

ビルドの前に、依存するパッケージを導入する必要があるわけですが、自動ではやってくれません。そのため、 nuget restore を、ビルド前スクリプトの中で実行する必要があります。

ただ nuget restore をするだけでは、ソリューションファイルが見つからないというエラーが出るかもしれません。ソリューションファイルが ‘(root/)src/Analyzer1.sln’ の場合、 nuget restore src/Analyzer1.sln をビルド前スクリプトに記述すればうまくいきます。

VSIX のパッケージングに時間がかかっている

これは単純に、ソリューションのプロパティから構成( Debug 、 Release )を変更することで、 AppVeyor の上では VSIX をビルドしない設定(チェックボックス外す)にできます。

GUI では “Build” の “Configration” から、 ‘appveyor.yml’ では configration:???? によって、 AppVeyor でビルドする構成名を自由に選べるので、 AppVeyor 専用の構成を作るのもいいかと思います。

NuGet へのデプロイに関して

AppVeyor では、 “Build” の “Automatic packaging” の “Package NuGet projects” という機能をオンにすれば、自動で ‘.nupkg’ を作ってくれます。

しかし、この機能によって作られるパッケージと、ソリューションの ‘tools’ フォルダ以下にある ‘install.ps1’ は合っていません。 install.ps1 は、 ‘.csproj’ ファイルの中にある Exec タグで行うパッケージングと合うように作られています。

Analyzer のテンプレートには Exec タグにコマンドが書かれており、ビルドすると ‘.nupkg’ を生成します。そのため、 AppVeyor に対してその ‘.nupkg’ を ARTIFACTS とするように指示して、デプロイできるようにします。

方法については公式ドキュメントを見るのが早いと思います。ただし、ビルド前の nuget restore によって、他のライブラリの ‘.nupkg’ が多くダウンロードされているため、自作の ‘.nupkg’ だけを選ぶように気を付ける必要があります。

ソリューションファイルが ‘(root/)src/Analyzer1.sln’ の場合、 (Get-ChildItem $env:APPVEYOR_BUILD_FOLDER + "\src\Analyzer1" -Recurse).Where{ $_.Extension -eq ".nupkg"} | %{ Push-AppveyorArtifact $_.FullName -FileName $_.Name }
とすれば問題なさそうです(未確認)。