しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET 5 アプリケーションのプリコンパイルと kpm pack のオプションについて調べた

ASP.NET 5 アプリケーションが Kudu によってどのようにデプロイされるのか調べた - しばやん雑記 を書いた時、Visual Studio の発行ダイアログにプリコンパイルオプションがあるのを見つけました。

f:id:shiba-yan:20150125183312p:plain

プリコンパイル出来るのであれば、Roslyn のコンパイル速度に依存しなくなるのでいい感じがします。というわけでさっくり試してみました。

ログを見ると kpm pack のオプションとして --no-source を指定するとプリコンパイルになるようです。

f:id:shiba-yan:20150125193809p:plain

パフォーマンスは詳しく測ってないですが、起動時間が改善しているように感じました。

今のところプリコンパイル対象になるのは普通のソースコードのみで、Razor に関しては今まで通りのようです。RTM までに Razor を含め、全てプリコンパイルするようになってほしいですね。

Azure Websites に Git でデプロイする場合には、予め SCM_KPM_PACK_OPTIONS に --no-source と --configuration Release を指定しておいた方が良い気がしました。あと kpm pack のメッセージが多すぎてめんどくさい場合には --quiet を付けておくと幸せになれそうです。

f:id:shiba-yan:20150125201458p:plain

No.1 こと @kosmosebi がはまっていた kpm restore でこける件は、kpm pack で指定する構成を Release にしておくと発生しないようです。設定しておけば Visual Studio で作成したテンプレートのまま git push するだけで動作します。*1

あと kpm pack のオプションにどんなものがあるのか、ヘルプを引っ張ってきました。

Usage: kpm pack [arguments] [options]

Arguments:
  [project]  Path to project, default is current directory

Options:
  -o|--out <PATH>                  Where does it go
  --configuration <CONFIGURATION>  The configuration to use for deployment (Debug|Release|{Custom})
  --overwrite                      Remove existing files in target folders
  --no-source                      Compiles the source files into NuGet packages
  --runtime <KRE>                  Name or full path of the KRE folder to include
  --native                         Build and include native images. User must provide targeted CoreCLR runtime versions along with this option.
  --wwwroot <NAME>                 Name of public folder in the project directory
  --wwwroot-out <NAME>             Name of public folder in the packed image, can be used only when the '--wwwroot' option or 'webroot' in project.json is specified
  --quiet                          Do not show output such as source/destination of packed files
  -?|-h|--help                     Show help information

プリコンパイルする --no-source の他に面白そうなのは --native オプションでしょうか。CoreCLR をランタイムとして選択している場合には、ネイティブコードを吐き出してくれるようです。*2

そういえば、これまで KRuntime (KRE) と呼ばれていた部分は、ちょっと前に名前が変わって .NET Cross-Platform Runtime SDK (.NET XRE) になったようですね。

klr コマンドも名前が dotnet に変わるはずなので、次のバージョンから注意が必要になりそうです。

Rename klr to dotnet by ChengTian · Pull Request #1087 · aspnet/dnx · GitHub

でも、今のところ k や kpm コマンドは名前が変わっていないみたいです。統一されるとは思いますが。

*1:Docker で動かす場合でも、予め kpm pack した方が安全な気がしないこともない

*2:.NET Native なのかもしれないけど、例外吐いて落ちた