銀の光と碧い空

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

Ubuntu で CoreCLR で HelloWorld したい

C# Advent Calendarの3日目です。

qiita.com

先日のConnect(); 2015 で .NET CoreとASP.NET 5 がRCになりました。

blogs.msdn.com

そのあと、C#ユーザーグループの勉強会で Ubuntu で .NET Coreを動かそうとしたけどなかなかうまくいかないという話もあったので、一度自分で動かしてみようと思ったので、その手順のまとめまになります。

dnvm コマンド 版

まずは以前からあったdnvmコマンドを使って .NET Core DNX SDKをインストールする方法です。いかにもドキュメントページっぽいここにGetting-Startedがあるのですが、この手順の通りやっても動きませんでした*1。GitHubのcoreclr リポジトリのRCのついたタグが切られたドキュメントのページが一番正確なようです。今回はこのドキュメントを参考に進めました。

github.com

まずはUbuntu環境ですが、Azure上に構築しました。このとき、Ubuntuのバージョンは「14.04 LTS」にするのを強く推奨します。ドキュメントにもありますが、今のところ .NET Core はUbuntu 14.04 LTS で動作確認していて、実際 15.04 などでセットアップしてみたら、Linuxパッケージの依存関係解決などがうまくいかず挫折しました。

また、WindowsクライアントからUbuntuにログインするのに、せっかくなので Win32-OpenSSH を使ってみました。が.... 現状、配布されているssh.exe をPowerShell Consoleで実行すると、viがまともに動かないなどの問題があるので、不本意ながらコマンドプロンプトからの実行をおすすめします。ただし、それでもペーストの文字数に制限があったりするので、Puttyなどを使うのが無難かもしれません。

github.com

さて、あとはドキュメント通りにセットアップしていきます。現状、.NET development Utility (dnu)がmonoを必要としているのでmonoのインストールをしています。.NET Version Manager (dnvm) をセットアップして最新のdnxを取得したところで、自分の環境はこうなりました。

$ dnvm list

Active Version              Runtime Architecture OperatingSystem Alias
------ -------              ------- ------------ --------------- -----
       1.0.0-rc2-16237      coreclr x64          linux
  *    1.0.0-rc2-16237      mono                 linux/osx       default

このあと、coreclr に切り替えてサンプルプログラムを実行するのですが、coreclr に切り替えた上で、dnu restoreを実行する必要があります。

$ dnvm use 1.0.0-rc2-16237 -r coreclr
$ dnu restore
$ dnx run

ドキュメントだと、monoの状態で dnu restore するだけで実行できるようにも読めますが、coreclr でやっておく必要がありました。

dotnet コマンド版

さて、Connect(); のキーノートで Scott Hanselman がデモしていた.NET Command Line Interface (dotnet) も試してみましょう。こちらに詳しい記事があります。

blog.shibayan.jp

こちらのセットアップですが、どうも上の手順で dnvm をセットアップした環境に追加するのに失敗しました。mono の依存関係にコンフリクトが起きてしまったので、今回は別にUbuntu 14.04 LTS*2を立てて実行しました。

こちらはちゃんとドキュメントのUbuntuのところの通りにセットアップすると動きました。

Getting started with .NET Core

dotnet init コマンドでHello World用の Program.csproject.jsonを勝手に作ってくれます。また、dotnet compile で実行可能なバイナリの生成もできます。dnx とか dnvm といったコマンドが持っていた機能をラップしてまとめる様な役割が.NET Command Line Interfaceの役割のようです。

github.com

さて、今回はAzure上に直にUbuntuを動かしていたわけですが、やはりDockerを使いたいということで、改めてDocker上で.NET Coreを動かすのもいずれやってみたいと思います。

*1:dnxがRC2の時点で

*2:こちらもこのバージョンで動作確認されている