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の上ではVISXをビルドしない設定(チェックボックス外す)にできます。

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 }
とすれば問題なさそうです(未確認)。

コメントを残す

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