銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Roslyn Analyzer を.NET Coreで参照する

C# 6でコンパイラープラットフォームとしてRoslynが導入され、コンパイラー拡張を作れるようになりました。今回は.NET Core on Linuxでこれが利用できるか試すことにしました。

Code RefactoringはVSIXであり、Visual Studioなしでは動きません。Diagnostic with Code Fix をNugetパッケージとして生成し、.NET Core on Linuxで動作するか確認してみます。

visualstudiogallery.msdn.microsoft.com

このコンパイラープラットフォーム拡張のSDKもVisual Studio拡張としての提供なので、現状はWindows上のVisual StudioでAnalyzerを作って、Nugetライブラリとして配布し、.NET Core on Linuxで参照する、というのが一番手軽そうです。とはいえ、Code Refactoring自体はPortableライブラリプロジェクトなので、これを.NET Core on Linuxで開発することも現実にはできそうな気がします*1

今回は、Roslyn SDKを入れると利用できる、Analyzerのテンプレートプロジェクトを何もいじらずに使います。クラス名をすべて大文字にするように警告する、トンデモAnalyzerです。

f:id:tanaka733:20160520233555p:plain

これをビルドするとnupkgファイルができるので、.NET Coreから参照できるようにしておきます。一番簡単なのは、.NET Core on Linuxを動かすマシンからアクセスできるファイルシステム上に直置きする方法かと思います。

$ ls /doc/nupkgs/
Analyzer3.1.0.5984.628.nupkg

ファイルシステムをNugetリポジトリとして参照するように Nuget.config を記述します。ちなみに前回紹介したaspnet generatorを使うとテンプレを生成できます。

$ yo aspnet:nuget
You called the aspnet subgenerator with the arg _nuget.config
NuGet.config created.
   create NuGet.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <clear />
    <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" />
    <add key="local" value="/doc/nupkgs">
  </packageSources>
</configuration>

そして、project.json にAnalyzerを追加します。

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },
  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.0-rc2-3002702"
    },
    "Analyzer3": "*"
  },
  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  }
}

これでAnalyzerは追加できましたが、残念ながら現状ではVisual Studio CodeからCodeFixはIntellisenseの候補に表示されません。ビルドすると警告やエラーとして表示されます。

$ dotnet build
Project analyzer (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling analyzer for .NETCoreApp,Version=v1.0
/doc/tanaka733/tanaka733/Documents/analyzer/Program.cs(5,18): warning Analyzer3: Type name 'Program' contains lowercase letters

Compilation succeeded.
    1 Warning(s)
    0 Error(s)

Time elapsed 00:00:32.4694799

IDE統合されていないのがつらいですが、Issueとして提案されているので、実装を期待したいところです。

github.com

ちなみにこのIssue Omnisharp-vscode リポジトリですが、.NET Core on Linux で開発するにあたって、複数の組織、リポジトリが提供しているツールを組み合わせています。

  • .NET Coreのコンパイラおよび拡張のためのSDKはRoslyn

github.com

  • Visual Studio Code

github.com

  • Visual Studio Code上でのC#デバッグやIntellisenseなどは Omnisharp提供。Yemonによるコードテンプレート生成もOmnisharp。

github.com

github.com

*1:未確認