しばやん雑記

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

ASP.NET Core 用のメタパッケージを絶対に使うべき理由

ASP.NET Core 2.0 から導入された必要なパッケージを一通り参照するメタパッケージですが、あまりにも参照が多いので何となく嫌な感じがする人はいると思いますが、絶対に使うべきなので理由を書いておきます。

メタパッケージに関しては公式ドキュメントにあるので、基本的な方針に関しては参照してください。

共有フレームワークとしてメタパッケージはインストールされる点が非常に大きい特徴です。

このドキュメントにはちゃんとメタパッケージを使うべき理由が書いてあります。

Applications that use the Microsoft.AspNetCore.App metapackage automatically take advantage of the ASP.NET Core shared framework. When you use the Microsoft.AspNetCore.App metapackage, no assets from the referenced ASP.NET Core NuGet packages are deployed with the application — the ASP.NET Core shared framework contains these assets. The assets in the shared framework are precompiled to improve application startup time.

Microsoft.AspNetCore.App metapackage for ASP.NET Core 2.1 and later | Microsoft Docs

.NET Core のランタイムと一緒に ASP.NET Core のメタパッケージはプリコンパイルされた形でインストールが行われるので、共有フレームワークを使うことでスタートアップのパフォーマンスが期待できます。

このメタパッケージは SDK として扱われる点が異なっています。アセンブリの依存関係もキッチリと検証の上に設定されているので、安心して利用することが出来ます。

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

dotnet --info を叩けばインストールされている SDK とメタパッケージを確認できます。

実際にメタパッケージを使っている場合と使わない場合での違いを紹介しておきます。

メタパッケージを使っている場合

Visual Studio から ASP.NET Core アプリケーションを作成すると、必ず Microsoft.AspNetCore.App メタパッケージが参照されているので弄る必要はありません。

ソリューションエクスプローラーの依存関係を見ると、SDK に表示されていることが分かります。

f:id:shiba-yan:20180701001627p:plain:w450

この状態でアプリケーションの発行を行うと、出力されるファイルは以下のようになります。

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

Microsoft.AspNetCore.App メタパッケージを参照しているので、アプリケーションのアセンブリとアセットぐらいしか含まれていません。

ASP.NET Core 自体は共有フレームワークが使われるので、出力は非常にコンパクトです。

メタパッケージを使わない場合

次にメタパッケージを使わない場合を見ていきます。空のプロジェクトを作成してビルドに必要なパッケージを手動で追加してみました。

先ほどと違って SDK には Microsoft.NETCore.App しか表示されていませんね。

f:id:shiba-yan:20180701001458p:plain:w450

これで発行を行うと、メタパッケージを使っている場合と異なり、大量の ASP.NET Core 関連のアセンブリが出力されていることが一目でわかりますね。

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

当然ながらデプロイにかかるコストも変わってくるわけですし、共有フレームワークと異なりプリコンパイルもされていないため、スタートアップでも不利となります。

App Service を使っている場合にはデプロイにかかる時間が増え、さらにストレージのパフォーマンスがあまり良くないため起動に時間がかかるようになります。Docker の場合でも重複するファイルをイメージに含めるわけなので、非常に効率が悪いです。

なので、メタパッケージを使わないデメリットは非常に大きいものとなっています。メリットは正直なところ全く存在しないので、最初からメタパッケージを使っておきましょう。