Build Insiderオピニオン:河合宜文(2)
Visual Studio 2015を前のめりに使いこなす! Analyzerの社内導入と展開
「using CSharp;」な企業であるグラニでは、Roslynが提供する「Analyzer」と呼ばれるコードの解析/生成機能をどう活用しているのか。その秘訣をチラリとご紹介。
前回のコラム「最先端のC#環境で働く開発者が感じたVisual Studio 2015移行への期待」では、「ASP.NET 5(DNX)へと移行するのだ!」という熱い思いを示したのですが、さて、その半年後であり、もう2015年も半分を過ぎようとしている今、「状況はどうなのか」というと、今年に関しては完全にあきらめています。
2015年のテクノロジの選択に関してはBuild Insider MEETUP with Graniでも発表させていただきましたが、「DNXに対しては待ち」と判断しました。そして結果、新規プロジェクトはOWINでの開発を、現行プロジェクトはそのままキープの状態で進めています。逆に、吹っ切れたことでOWINをフル活用する道に入っていて、「Middleware作成」から、IISへのホストだけではなく「SelfHost+Windows Service」など、さまざまな領域でOWINの活用を開始しています。
Visual Studio 2015 RCの活用
新規プロジェクトの開発ベースは完全にVisual Studio 2015 RC(以下、VS 2015)に移しました。既存プロジェクトに関しては、まだVS 2015の動作が、特にコンパイラーの挙動が怪しく、コンパイルエラー時に「"csc2.exe" はコード 1 を伴って終了しました」と、エラー箇所がどこなのかを教えてくれないまま沈黙するという致命的な欠陥を抱えているため、まだ移行しきれていません。次のVSの公開で直っていれば、即座に移行したいところです。
(一部の)プロジェクトのベースがVS 2015に移ったことにより、前回のコラムの最後に紹介した「Grani.RoslynTools」が本格的に稼働を始めました。今回は、Grani.RoslynToolsつまりVS 2015用のAnalyzerを会社内で活用する環境をどのようにして作っていくかを具体的にお話します。
Analyzerとは?
VS 2015からC#コンパイラーが*1Roslynベースとなりました。
ここで取り上げる「Analyzer」(Analyzer with Code Fix。以下では単に「Analyzer」)とは「Roslynを使ったコード解析とコード生成を、ユーザーが自分の手で作ることができる」といったものです。具体的には、Style Copのような独自のエラー定義(次の画面の上)とソースコードや診断情報を基にしたコード生成が可能です(同下)。
上: メソッド呼び出しで生成されるIObservable<T>
オブジェクトをSubscribeしていない場合に警告を出すAnalyzer。
下: メソッドの引数と属性を元にWriteEvent
メソッドの呼び出しと引数を生成するAnalyzer。
Roslynベースでユーザーの作れる拡張にはCode Refactoringと前述のAnalyzerの2種類がありますが、配布可能な方法に違いがあります。Code RefactoringはVSIX(VS拡張機能)でしか配布できませんが、AnalyzerはVSIXとNuGetの両方に対応しています。お勧めはNuGetでの配布です。NuGetの場合は、通常のNuGetのDLLと同じようにプロジェクトごとにAnalyzerがひも付けられるので、インストールやバージョンアップも容易だし、プロジェクト固有のAnalyzerも投入できるなど、取り扱いが非常に容易になります。
では「機能面の違いは?」というと、Code Refactoringはユーザーが選択しているコード行からのアクションを生成できます。一方、Analyzerはソースコード自体からしかアクションは生成できません。ただし、ユーザーが選択しているコード行からアクションを生成する必要がないのであれば、リファクタリング(コード整形/生成)用途のみであっても、Analyzerで代用できます。単純なリファクタリング用途ならば、Analyzerの設定でDiagnosticSeverity.Hidden
にしておけば、警告は出さずにCode Fix部分のみを利用することが可能です。なお、Analyzerの作り方の具体的な話は「VS2015のRoslynでCode Analyzerを自作する(ついでにUnityコードも解析する)」や「UniRxでの空呼び出し検出、或いはRoslynによるCode Aware Libraries時代の到来について」を参照してください。
というわけで、グラニでは「コード生成のためだけに使うリファクタリング用途では、DiagnosticSeverity.Hidden
に設定したAnalyzerのみを作成/配布する」というルールで運用しています。
完成したAnalyzerは、社内NuGetで配布しています。社内NuGetの立て方は「社内の開発環境の改善&効率化のためにNuGetを活用しよう」に詳しくありますが、例えば「Analyzerを更新したらGitHubにPush→CIサーバーがビルドしてnupkgも生成してNuGetサーバーに自動アップロード→Analyzerを利用するプロジェクトでUpdate」のような流れになっていると、自然に最新のものが組み込まれる環境が作れるでしょう。
社内独自のライブラリに固有な事情や、(ソースコードに対して柔軟な)自動生成されるとうれしくなるようなプロジェクト固有のことなど、Analyzerは基盤ライブラリとしてVS 2015以降では多くの場面で活用できると思われます。今から前のめりに使いこなして損はないでしょう!
河合 宜文 (かわい よしふみ)
株式会社グラニ取締役CTO。Microsoft MVP for Visual C#。特にLINQが非常に好き。最近はUnity開発においてもLINQをフル活用するために、Unity用のReactive Extensions「UniRx」を作っています。
・ブログ: http://neue.cc/
・Twitter:@neuecc
1. 最先端のC#環境で働く開発者が感じたVisual Studio 2015移行への期待
最先端のC#環境でゲーム開発を行っているグラニでは、Visual Studio 2015 Previewを見て何を感じたのか。LINQとReactive Programmingで有名なneuecc氏によるコラム、始動。
2. 【現在、表示中】≫ Visual Studio 2015を前のめりに使いこなす! Analyzerの社内導入と展開
「using CSharp;」な企業であるグラニでは、Roslynが提供する「Analyzer」と呼ばれるコードの解析/生成機能をどう活用しているのか。その秘訣をチラリとご紹介。
3. C#における構造化ログの手法、そしてデータ可視化のためのDomoの薦め
最近、より重要性を増しているログ。グラニではログをどのような方法で扱っているのか、そして、その根底にあるグラニのポリシーとはどんなものだろう。
4. 各言語に広まったRx(Reactive Extensions、ReactiveX)の現状・これから
.NETから始まったRx(Reactive Extensions)が、なぜRxJavaやRxJSなど他の開発言語で人気を集めているのか。“ReactiveX”とは何か? そしてRxは、これからどう進化していくのか。