第1回 ASP.NET 5をOS X/Linuxで使うための準備:連載:OS X/LinuxによるASP.NET 5アプリ開発ガイド(5/5 ページ)
OS X/UbuntuでASP.NET 5アプリを動作させるまでの手順をステップバイステップに解説していく。
Webアプリを実行してみる
次に「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.
…… 省略 ……
「Microsoft.Framework.ConfigurationModel.IConfiguration」アセンブリが見つからなくてエラーとなった。
これは、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
「Started」と表示されればOKだ。
先ほど見た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ファイルを作成/編集しておこう。
- https://www.myget.org/F/aspnetmaster/api/v2: ASP.NET 5のマスタービルド
- https://www.myget.org/F/aspnetrelease/api/v2: ASP.NET 5のnightlyビルド(「release」バージョン)
- https://www.myget.org/F/aspnetvnext/api/v2: ASP.NET 5のnightlyビルド(「dev」バージョン)
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のソースを取得して適当なディレクトリに展開する
- automake、libtoolの二つのパッケージをインストールする(「sudo apt-get install automake libtools」コマンド)
- libuvのソースを展開したディレクトリに移動する
- 「sh autogen.sh」コマンドを実行する
- 「./configure」コマンドを実行する
- 「make」コマンドを実行する
- 「sudo make install」コマンドを実行する
- 「sudo ldconfig」コマンドを実行する
以上の手順でlibuv.so.1ファイルを「/usr/local/lib」ディレクトリにインストールした後、OS Xと同様の手順でHelloMvcアプリを実行できた(実際にはこの作業は、XREのインストール前に行っておいてもよい)。
今回は、OS X/UbuntuへのASP.NET 5の導入とサンプルコードを動作させるまでの手順を見た。次回は、実際に自分でコードを書いてみることにしよう。
Copyright© Digital Advantage Corp. All Rights Reserved.