銀の光と碧い空

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

.NET Core on Linux の今年をふりかえってみる

.NET Core Advent Calendar 3日目です。

qiita.com

昨日のPowerShell on Linux に続いて、.NET Core on Linux (特に.NET Core on RHEL)の現状を、アプリをどうやって開発するのか?に焦点を置いて軽くふりかえってみたいと思います。

.NET Core のリリースとインストール

.NET Core は今年の6月に正式版がリリースされたのですが、.NET Core 本体は正式リリースであるものの、ビルドまわりを含めたtoolingはpreview状態です。そのため、先日リリースされたのは.NET Core 1.1ですが、ビルドツールとしてMSBuildが採用されているバージョンは.NET Core 1.0 preview 3という扱いでリリースされています。.NET Standard 2.0 への移行含めてまだまだ落ち着かない状態はつづきそうです。

blogs.msdn.microsoft.com

もう一つ注意点というか、配布されるタイミングの違いですが、ほとんどのOS向けの.NET Core SDKのリリースはMicrosoftが行っています。インストール手順としてはここにあるドキュメントの通りで、パッケージもMicrosoftが公開されているはずです。

.NET Core Downloads

ですが、RHEL向けのバイナリについては、特にRed Hatがサポート対象としているものについてはRed Hat が公開しています。そのため、公開のタイミングもずれています。実際、.NET Core 1.1はConnect(); 2016のタイミングでしたが、RHEL向けのバイナリは11/29にリリースされました。

またサポートについても違いがあります。.NET Core 一般のサポートはこのページから飛べますが、Microsoft Support Professionalにインシデントを作成してサポートを受けることになります。ちなみに特にWindows上に限ると書いていないのですが、他のOS上のトラブルでも対応してもらえるのかが気になるところです。

.NET Platform Support

.NET Core on RHELのサポートはRed Hat経由になります。開発者向けには、RHELのOS Subscriptionも含む開発者向けプログラムが用意されており無料で使うことができます。

developers.redhat.com

.NET Core on Linuxでの開発

じゃあ、実際アプリを開発するとどうなるのかという話に移ります。といっても、私は仕事上、実際に運用するアプリを作っているわけではなく、新機能の検証とか、Red Hatの製品の機能との組み合わせを確かめるためにアプリを作った範囲での話になります。

なんといってもどのツール(IDE/テキストエディタ)で開発するか、ですがVisual Studio Code一択かなあという気がしています。もちろんvimやemacsを使いなれた人であれば使いなれた環境で.NET Coreアプリを開発するのもありかもしれません。ただ、私が一般的に「.NET Core アプリをLinuxで開発するには、どのツールがよいですか」と聞かれたら「Visual Studio Codeです」と答えます。Jetbrainsが出したRiderですがEAPになって改めて試してみましたが、編集中にフリーズしたりしてちょっとサンプルアプリレベルでも作るのはつらいかなあという印象です。機能自体はVisual Studio Codeより多そうですが、おすすめするためにはもう少ししてから調べ直したいなと思っています。

では、Visual Studio Code を使えば快適化と言われると、さすがにVisual StudioでC#アプリを開発していた時と比べる明らかに使い勝手は落ちます。実際つらいと感じた具体的なポイントは

  • 新しいアイテムの追加がないので、クラスファイル1つ追加するのも、空ファイルを追加してから自分でコードを書く必要がある
  • NuGet パッケージマネジャーのGUIがない。CUIもnuget.exe相当のものはなく、dotnet コマンド経由のもののみ。
  • Razor Viewの補完が聞かない
  • Roslyn SDKのAnalyzer+Code Fixがリアルタイムで動かない (コンパイル時検出+コードFixはできない)

といったあたりでしょうか。いくつか今後のリリースでの対応が予定さているものもありますが、このあたりの機能強化を考えたときに面倒なのは、.NET Core CLIに追加すべき機能なのか、Visual Studio Code (より正確にはそのC#拡張)に追加すべきなのか、NuGetに追加すべきなのか、といったところを切り分けてからそれぞれにフィードバックしないと、フィードバックしてもあまりよい反応がないということです。今年は最初のリリースということで、来年はtoolingもGAになるはずなので、このあたりの機能強化も期待したいところです。

Windowsで開発、Linuxで運用

上の説ではあくまでLinuxで開発するという視点だったのですが、開発マシンはWindowsで、Linux Server上で運用する、というユースケースがあるかもしれません。そのケースにおいては、ぜひともVisual Studioでの開発をおすすめします。.NET Coreアプリは、WindowsでビルドしたバイナリでもそのままコピーするだけでLinux上で動きます*1。また、Visual StudioからLinuxサーバー上で動く.NET Coreプロセスをリモートデバッグすることもできます。これについては、Visual Studio Tools for Docker *2で実現できているため、Docker on WindowsやAzure Container Service固有の技術だと思われるかもしれませんが、違います。あくまで標準の技術として開発されているので、技術的には、任意のLinux (あるいはMacOSX)上へ、任意のDocker ホストへ、そして、Red Hat OpenShift や他のContainer Platform へもデプロイ&デバッグができます。ただ、必要なコマンドやそのオプションが接続先によって異るので、Visual Studio Tools for DockerやVS本体の機能だけでは使うことができません。このあたりは使い易い形での手順がまとまったら、ブログとかに書いていきたいと思っています。

まとめ

という感じで、まとめると、.NET Core on Linux の現状はできるようになった、けどもっと使いやすくできる、という状態な気がします。まだMSBuild+csprojへの移行もありますし、引き続き情報発信していこうと思っています。また、使い易くするためのVisual Studio 拡張やVisual Studio Code拡張のアイディアもあるので、その辺も作っていきたいところです。また、.NET Core on Linuxでこういうことしたいけど、といったご相談もいただければと思います。

*1:アプリモデルにより、プロジェクトやビルド時の設定は必要

*2:Visual Studio 2017からはVS本体に取り込まれる予定