M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

Ubuntu14.04上にASP.NET MVC 5.2開発環境をつくる

引き続きC#/.NETについてお勉強をしている今日このごろですが、きょうはUbuntu上にASP.NET MVC 5.2開発環境をつくるというのを試してみました。最終目標はKestrelを使ったサーバ環境構築ですが、だんだんと行きましょう。今回はともかく開発環境です。

あらかじめまとめじみた感想を述べておくと、WindowsVisual Studioの組み合わせよりもMac OS XとXamarin Studioの組み合わせのほうが、そしてそれよりさらにLinuxMonoDevelopの組み合わせのほうが圧倒的に快適だということです。
もちろんプラットフォームのちがいにより使用できるアプリケーション・モデルがちがったり、フレームワークのバージョンに制限があったりと課題も多いのですが、IDEの起動とビルドの観点で言うとMacLinuxが圧勝でした。多分にSSDの効果もあるようですが。とにかく速いのです。

前提

作業環境/仮想マシンホスト

マシン: Macbook 12inch
CPU: 1.1GHz 2コア
メモリ: 8GB
OS: macOS 10.12 Sierra

開発環境/仮想マシン

マシン: VirtualBox5.1.6により再生された仮想マシン
CPU: 1コア
メモリ: 1GB
OS: Ubuntu 14.04 LTS
IDE: MonoDevelop 4.0.12
フレームワーク: .NET 4.5、ASP.NET 5.2

環境構築

フェーズ1:仮想マシンの用意

まずはこれから環境構築していくLinuxマシンを用意する。
今回はMacbook上で作業するのでLinuxマシンを稼働させるための仮想マシンを用意する必要がある。

Oracle VM VirtualBox公式サイトからMac OS X用のインストーラをダウンロードする。

f:id:m12i:20161008142059p:plain

ダウンロード・ページでは
Mac OS Xインストーラのリンクが「VirtualBox 5.1.6 for OS X hosts amd64」となっており、この「amd64」という表記が釈然としないが、ともかくこれしか選択肢はないのでこれを選ぶ。

ダウンロードしたdmgファイルをオープンして、インストーラを起動、ウィザードにしたがい淡々とインストールする。

続いて仮想マシン上で動かすLinux OSの準備をする。いろいろ本題以外のところで躓きたくはないので、Ubuntu Japanese Teamの皆さんが公開してくれている
できあいのUbuntu 14.04 LTSハードディスクイメージを使ってセットアップする。

f:id:m12i:20161008141852p:plain

具体的な手順はダウンロード・ページを参照のこと。

今回はデフォルト通り搭載メモリ1GBで仮想マシンを作成している。WindowsVisual Studioの構成であればありえないと思うが、後述の通りLinuxMonoDevelopの構成ならこれで十分である。

フェーズ2:MonoDevelopのインストール

LauncherからUbuntuソフトウェアセンターを起動する。

f:id:m12i:20161008142330p:plain

MonoDevelopを検索する。この記事を書いている時点でデフォルトのリポジトリにあったMonoDevelopのバージョンは4.0.12。
パッケージ詳細ページにていくつかの追加のアドオン(下図)を選択した上で、[インストール]をクリックする。数分間待つとインストールが終わる。

f:id:m12i:20161008142611p:plain

余談ではあるがパッケージのダウンロードサイズの小ささにびっくりさせられる。50MB以下である。すごく小さい。

インストールが完了したらLauncherからMonoDevelopを起動する。

f:id:m12i:20161008143457p:plain

これも余談ではあるが、このときの待機時間に注目で、今回構築したUbuntu(CPUコア数1、メモリ1GB)上でも5〜10秒程度で起動した。Macbook(CPU動作周波数1.1GHz、CPUコア数2、メモリ8GB)上でXamarin Studioを起動するよりも明らかに速い。さらにはHDD搭載のWindowsマシン上で稼働するVisual Studioの、全体的にもっさりした動作の中でもとりわけ印象深い起動時間の長さと比べたとき、ちょっとした感動を覚えてしまう(もちろんMacbookは──したがって仮想マシン上のLinuxも──ストレージはSSDなのでこの比較は多分に不公平ではある)。

続いて後述の事情からNuGetアドインをインストールする。

f:id:m12i:20161008143708p:plain

  • [Gallery]タブの[リポジトリ]欄から今しがた登録したリポジトリ「mrward.github.com」を選択。
  • 「NuGet Package Management」というアドインが表示されるので(下図)これを選択して[インストール]をクリック。

f:id:m12i:20161008143752p:plain

インストールが完了したらアドインマネージャのウィンドウを閉じる。

フェーズ3:ソリューションの準備とビルド

MonoDevelopのバージョン4.0.12が提供するソリューション作成時のオプションで選べるのはASP.NET MVCのバージョン3.0で、バージョン5.xは選べない。また仮にこのバージョン3.0のオプションを選んでも、MonoDevelop 4.0.12のパッケージのバグでアプリがきちんと動作しない。

例によってWeb上には先人たちが苦労したログがそこここにあるが(例えばここ)、ASP.NETどころか.NETそのもの初心者にとってハードルは高い。

よってここでは「Xamarin Studioでスケルトンを作成してそれを使う」という強引な方法をとった。
Xamarinで作成したスケルトンはこちらのGitリポジトリからダウンロードできる。

f:id:m12i:20161008143330p:plain

リポジトリからダウンロードしたzipファイルを展開し、slnファイルをダブルクリックしてMonoDevelopでオープンする。

f:id:m12i:20161008143902p:plain

  • プロジェクトの[参照]を開くと参照エラーとなっている箇所がある。
  • そこでソリューション名の上で右クリックし[Manage NuGet Packages]をクリックする。
  • 警告が表示されるが(「そんなこと言われてもYESと答えるしかない」)、[はい]をクリック。
  • そしてキーワード欄に「ASP.NET MVC」と入力してパッケージを検索。
  • 一覧に表示された結果のなかから「Microsoft ASP.NET MVC」を選択、右側ペインの下側に表示された[Manage]をクリック(下図)。
  • Select Projectsウィンドウが表示されるのでメインのプロジェクトとテストのプロジェクト双方にチェックを入れて、[OK]をクリック。
  • ここで再度前述の警告が表示されることもあるが同様に対処する。
  • 加えてライセンスへの同意を求められるので内容を確認して[OK]をクリックする。

f:id:m12i:20161008144043p:plain

  • 続いてキーワード欄に「NUnit」と入力してパッケージを検索。
  • 一覧に表示された結果のなかからその名も「NUnit」(バージョンはこの記事を執筆している時点で3.5.0)を選択。
  • Select Projectsウィンドウが表示されるのでテストのプロジェクトにだけチェックを入れて、[OK]をクリック。
  • テストのプロジェクトのpackage.jsonNUnitのバージョン2.6の指定が残ってしまうのでこの行を削除して保存。

f:id:m12i:20161008144226p:plain

ここでMonoDevelopを再起動する。これをしないとプロジェクトの参照設定が正しくならなかった。

  • MonoDevelopのメニューから[ビルド]→[全て再ビルド]をクリック。
  • ビルド完了し次第、[実行]→[Start Without Debugging]をクリックしてアプリケーションを起動する。

[アプリケーション出力]欄に以下のようなメッセージが出力され、しばらくするとWebブラウザが起動してトップページが表示される:

Adding applications '/:.'...
Registering application:
Host: any
Port: any
Virtual path: /
Physical path: /home/ubuntu01/ダウンロード/Hello.NetMvc52.On.MonoDevelop-master/Hello.NetMvc52.On.MonoDevelop/
xsp4
Listening on address: 127.0.0.1
Root directory: /home/ubuntu01/ダウンロード/Hello.NetMvc52.On.MonoDevelop-master/Hello.NetMvc52.On.MonoDevelop
Listening on port: 8080 (non-secure)

──のだが、なぜか初回表示時は以下のようにエラー画面になってしまう。

f:id:m12i:20161008144321p:plain

そして、再読込をすると治る(下図)。以後は問題ない。

f:id:m12i:20161008144354p:plain