次に「Home-master/samples」ディレクトリにあるHelloMvcプロジェクトを実行してみる。これはASP.NET MVCベースのWebアプリのサンプルだ。ただし、本稿執筆時点ではaspnet/Homeで配布されているサンプルコードが、XREのバージョンに合っていないため、多少の変更が必要になる。
まずは、OS XでHelloMvcアプリをそのままの状態で実行してみる(※Ubuntuでの実行方法は後述するが、OS Xでの実行の流れを読んでから、Ubuntuの場合の説明に進んでほしい)。
OS XでのHelloMvcアプリの実行(Ubuntuでも同じ手順が必要)
先ほどは「k run」コマンドでコンソールアプリを実行したが、今度は「k kestrel」コマンドを実行する。「Kestrel」は、ASP.NET 5用のWebサーバーであり、OS X/Ubuntuの両者で動作する。「k kestrel」コマンドではこれを使用して、HelloMvcアプリをホストする。
「k kestrel」でHelloMvcアプリを実行したところ、見事に例外が発生している。
$ cd ~/work/aspnet5/Home-master/samples/HelloMvc/
$ kpm restore # パッケージを取得
Restoring packages for /Users/user_name/work/aspnet5/Home-master/samples/HelloMvc/project.json
GET https://www.nuget.org/api/v2/FindPackagesById()?Id='Kestrel'.
GET https://www.nuget.org/api/v2/FindPackagesById()?Id='Microsoft.AspNet.Diagnostics'.
…… 省略 ……
Installing System.ComponentModel.Primitives 4.0.0-beta-22231
Installing System.IO.Compression 4.0.0-beta-22231
Restore complete, 256576ms elapsed
$ k kestrel # 「k kestrel」コマンドでWebアプリを実行
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Framework.ConfigurationModel.IConfiguration, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
…… 省略 ……
これは、OS XにインストールされているXREのバージョンとproject.jsonファイルに記述されている依存が合致していないことが原因だ(Ubuntuの場合はさらにもう一つ原因があるが、これについては後述)。そこで、XREのバージョンを確認する。これには「kvm list」コマンドが使える。
$ kvm list
Active Version Runtime Location Alias
------ ------- ------- -------- -----
* 1.0.0-beta3-11030 mono ~/.k/runtimes default
インストールされているのは「1.0.0-beta3-11030」だ。次に、project.jsonファイルの内容を確認してみよう。
$ cat project.json
{
"dependencies": {
"Kestrel": "1.0.0-beta1",
"Microsoft.AspNet.Diagnostics": "1.0.0-beta1",
"Microsoft.AspNet.Hosting": "1.0.0-beta1",
"Microsoft.AspNet.Mvc": "6.0.0-beta1",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta1"
},
"commands": {
"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5001",
"kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"
},
"frameworks": {
"aspnet50": {},
"aspnetcore50": {}
}
}
「"dependencies"」セクションでは、このプロジェクトで使用するアセンブリのバージョンが「1.0.0-beta1」であると記されている。このバージョンの違いがエラーの原因だ。これについてはUbuntuでも同様だ(ただし、本稿執筆時点ではUbuntuにインストールされるXREのバージョンは1.0.0-beta2と差異がある)。
そこでこのファイルを次のように書き換える。
{
"dependencies": {
"Kestrel": "1.0.0-*",
"Microsoft.AspNet.Diagnostics": "1.0.0-*",
"Microsoft.AspNet.Hosting": "1.0.0-*",
"Microsoft.AspNet.Mvc": "6.0.0-*",
"Microsoft.AspNet.Server.WebListener": "1.0.0-*"
},
"commands": {
…… 省略 ……
},
"frameworks": {
…… 省略 ……
}
}
以上の修正を行い、「kpm restore」コマンドを実行し、続いて「k kestrel」コマンドを実行すると、OS Xでは無事にWebアプリが起動される。
$ k kestrel
Started
先ほど見たproject.jsonファイルに以下のような「"commands"」セクションがあったことにお気付きだろうか。この中にある「"kestrel"」の値が「k kestrel」コマンドで実行される内容だ。
"commands": {
"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5001",
"kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004"
},
「web」と「kestrel」の二つのコマンドが記述されている。前者はWindowsでこのアプリを実行するためのコマンドだ。後者の「kestrel」コマンドの記述からは、このアプリはローカルホストの5004番ポートをリッスンすることが分かる(「--server.urls http://localhost:5004」)。そこで、localhost:5004ポートにWebブラウザーでアクセスをしてみると次のような画面が表示される。これでHelloMvcの動作も確認できた。
Kestrelサーバーを終了させるには、ターミナル画面で[Enter]キーを押す。これでアプリの実行が終了する(ターミナルにもプロンプトが表示され、コマンド入力待ちになる)。
なお、project.jsonファイルの修正だけではうまくいかない場合もある。その場合には、NuGet.configファイルをアプリケーションのルートディレクトリに作成して、例えば以下のような内容を記述する。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="AspNetVNext" value="https://www.myget.org/F/aspnetrelease/api/v2/" />
<add key="NuGet.org" value="https://nuget.org/api/v2/" />
</packageSources>
</configuration>
「kpm restore」コマンドはデフォルトでNuGetから必要なパッケージをインストールするが、ASP.NET 5は現状ではまだベータ版であり、日々進化が続いている。そのため、NuGetで配布されているパッケージでは依存を解決できないことがある。そのときには、MyGetからNightlyビルドなどのパッケージを入手するように設定すると問題が解決できる場合がある。
MyGetからは以下のようなURLでASP.NET 5関連の各種パッケージが配布されているので、必要に応じて適切なパッケージを入手できるようにNuGet.configファイルを作成/編集しておこう。
NuGet.configファイルは「~/.config/NuGet」ディレクトリに置かれるが、個々のプロジェクトごとにそのルートディレクトリに同名のファイルを作成することで、その設定を変更できる。
OS Xでは、project.jsonファイルの修正だけでHelloMvcアプリが動作したが(必要に応じて、NuGet.configファイルも編集すること)、Ubuntuではもう少し手間が必要になる。
UbuntuでHelloMvcアプリを実行する場合の注意点
Ubuntuの場合、project.jsonファイルを上記のように修正するだけでは、HelloMvcアプリは動作しないかもしれない(筆者の環境ではそうだった)。この状況が発生する主な原因は、WebサーバーであるKestrelが依存しているlibuv.so.1ファイルがインストールされていないことだ。
$ k kestrel
System.InvalidOperationException: Unable to load libuv. Make sure libuv is installed and available as libuv.so.1
…… 省略 ……
libuvはGitHubの「libuv/libuv」ページからダウンロードしてビルド/インストールすればよい。ビルドの手順もこのページに記載されているので、参考にしてほしい。ここでは、以下の手順でlibuv.so.1ファイルをビルド/インストールした。
以上の手順でlibuv.so.1ファイルを「/usr/local/lib」ディレクトリにインストールした後、OS Xと同様の手順でHelloMvcアプリを実行できた(実際にはこの作業は、XREのインストール前に行っておいてもよい)。
今回は、OS X/UbuntuへのASP.NET 5の導入とサンプルコードを動作させるまでの手順を見た。次回は、実際に自分でコードを書いてみることにしよう。
Copyright© Digital Advantage Corp. All Rights Reserved.