主にLinuxのための ASP.NET 5.0 メモ

今年ちらりとあったpyspaでは ASP.NET 5.0とかdnxとかいじって(あの頃からかなり変わっちゃったけど)たのでそのあたりまとめ。

# ASP.NET 5.0 のこれまでとの大きな違い

* coreclrも対象なので Linux とか Mac とかでも普通に動く
* IISと決別
* その影響で名前空間が System.Web 以下から Microsoft.AspNet 以下に移動

# ASP.NET 5.0 の環境 (DNX/dotnet)

## 今のところの環境構築

dnxを使って環境を制御します。どこぞの *env なしくみでしょう。
dnxはcoreclr専用ではなく、monoランタイムを使った環境も取り扱えます。
各種プラットホームでの構築方法は [Getting Started](https://github.com/aspnet/Home) にあります。
libunwindやlibuvなど別途必要なものもあるので注意。

## 今後の動向

kre,dnxところころ変わるツールですがまた dotnet という名前に代わるようです。
dnxまではASP.NETチームが開発していたのかリポジトリもそちらにありましたが、dotnetは .NET Foundation のリポジトリに[cli](https://github.com/dotnet/cli) という名前でリポジトリが作られています。
ASP.NET 5.0もrc2でツールチェインをdnxからdotnet-cliに移行する予定のようです。

# もっと必要な環境

ランタイムやらコンパイルやらそのあたりのことはdnxにお任せでOKなので、それ以外のツールボックス

## コードジェネレーター

だいたい最初に必要なファイルがそこそこあるので、しょっぱなのコードジェネレーターが便利です。
yoを使うので、そこらへん必要なものを準備。

* node
* npm
* yo
* generator-aspnet

## エディター

Linux に Visual Studio などないので、[Visual Studio Code](https://code.visualstudio.com/) などを利用します。
が、emacs(好きなエディタに脳内補完してください)ですべてをこなす身としては、専用のエディタに惑わされることなく [OmniSharp](http://www.omnisharp.net/) を使いましょう。

## Omnisharp

以前の[omnisharp](https://github.com/OmniSharp/OmniSharp) は [NRefactory](https://github.com/icsharpcode/NRefactory) を利用していたようですが、開発は終了したようです。現在は dnx でも利用されている C#コンパイラの [Roslyn](https://github.com/dotnet/roslyn) を利用した [omnisharp-roslyn](https://github.com/OmniSharp/omnisharp-roslyn) にメインが移っているようです。

# ASP.NET 5.0

ASP.NET 5.0 は [OWin](http://owin.org/) の考えを引き継いでいます。
ようするに WSGIとかRackとかあのあたりの話です。
サーバーとアプリケーション間の規約を決めたということで、IIS以外でも実行可能となるわけですが、Owin自体はいろいろ間に合わなかったようで、考え方だけが ASP.NET 5.0に持ち込まれたようです。

ASP.NET 5.0のアプリケーションは Startupクラスを定義して、ApplicationBuilderにアプリケーションの定義を追加していきます。
フレームワークなど使わずとりあえず実行してみるだけなら、 Run メソッドで簡単にかけます。
一番簡単な例

``` c#:Startup.cs
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;

class Startup
{
    public void Configure(IApplicationBuilder builder)
    {
         builder.Run(async (context) => {
             await context.Response.WriteAsync("Hello");
         });
    }
} 
```

最初から非同期であることが後発の強みでしょうか。
その他Webアプリケーションやフレームワークを支えるためのインフラストラクチャっぽい部分も充実しています。

* [Middleware](https://docs.asp.net/en/latest/fundamentals/middleware.html)
* [Dependency Injection](https://docs.asp.net/en/latest/fundamentals/dependency-injection.html)
* [Request Features](https://docs.asp.net/en/latest/fundamentals/request-features.html)


# データベース

## Entity Framework

Entity FramworkがASP.NETのリポジトリでcoreclr対応したバージョン（[Entityframework7]()）を開発されています。
用意されているドライバは InMemory, SQLite, SQLServer が公式っぽいところですが、Linux向けとしては Postgresql 用のドライバ [npgsql](http://www.npgsql.org/) が、[Entityframework7 対応のドライバ](https://www.nuget.org/packages/EntityFramework7.Npgsql/3.1.0-rc1-3)も開発しています。coreclrビルドもすでにベータ提供されています。(MySQLはいつ...)

## EFコマンド

**TODO**

* https://www.nuget.org/packages/EntityFramework.Commands/7.0.0-rc1-final
* ef migration
* ef database update

## Dapper

**TODO**

* https://www.nuget.org/packages/Dapper/1.50.0-beta5

# テスト

## テストフレームワーク

**TODO**

* xunit http://xunit.github.io/
* Microsoft.AspNet.TestHost
* カバレージ


## CIツール

Windows向けはもう [appveyor](http://www.appveyor.com/) 一択として、 [travis-ci](https://travis-ci.org/) は、 [公式にmonoをサポートしている](https://docs.travis-ci.com/user/languages/csharp/) ので、そのうえでdnx環境を作ってテストを実行できるようです。
というか [aspnet チームはLinuxでのcoreclrのテストは travis を使っている](https://travis-ci.org/aspnet/Routing) ので、このあたりを参考にすればよさそうです。
また、この後に書くように、[microsoftがdocker hub にイメージを公開してくれている](https://hub.docker.com/r/microsoft/aspnet/) ので、このイメージを使えば [wercker](http://wercker.com/) でもいけるのでは？

# デプロイ

## docker

microsoft謹製の ASP.NET用イメージが docker hub に登録されてます。
yoで生成したままのDockerfileでコンテナを作ると、Kestrelがデフォルトで 127.0.0.1 をListenするのがいけないのか、exposeされている5000番をdocker runのpublish指定してもつながりません。

`server.urls` オプションを追加して、0.0.0.0:5000でListenさせるようにします。

```dockerfile:DockerFile
FROM microsoft/aspnet:1.0.0-rc1-update1

COPY . /app
WORKDIR /app
RUN ["dnu", "restore"]

EXPOSE 5000/tcp
ENTRYPOINT ["dnx", "-p", "project.json", "web", "--server.urls=http://0.0.0.0:5000"]
```

`docker build -t my/aspnet-1 .` などしてイメージを作成したのち、 `docker run -p 127.0.0.1:5000:500 my/aspnet-1` などで起動すれば、 http://localhost:5000 でつながります。

**TODO**

* kudu
* heroku
* azure

# ライブラリ

* nuget
* sake
* myget
* appveyor


# 参考文献

* [ASP.NET Documentation](https://docs.asp.net/en/latest/)
* [github/aspnet](https://github.com/aspnet)
* [THE ASP.NET Site](http://www.asp.net/)
* [EntityFramework Documentation](http://docs.efproject.net/en/latest/)
* [CoreCLR Site](http://dotnet.github.io/)