より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

.NET Coreの自己完結型(self-contained app)にするとファイルサイズはどれだけ増加するのか?

C# その2 Advent Calendar 2018 - Qiita

の22日目の記事です。

先日、上記のようにConnect(); Japanのイベントに参加させていただき、刺激を受けての話です。

目次

自己完結型の展開について

華麗に.NET Coreを使いこなしている業界とは異なり、私の業務ではクライアント端末について制約を受け、.NET Frameworkのバージョンをこちらで選ぶことも難しいです。

ですが、.NET Coreでは自己完結型(self-contained app)の展開という仕組みがあります。

これにより、端末の.NET Coreのバージョンに関係なく動くというものです。

仕組みとしては、自己完結型として出力したアプリケーションの中に、.NET Coreのdllも含めるというものです。

よって、ファイルサイズは重くなります。これが自己完結型のデメリットになってきます。

では、自己完結型にした場合の、肝心のファイルサイズはどうなるのか?

ということがポイントになってきます。

検索しても見つからなかったので、自分で調べて確認したことを書きます。

自己完結型として出力する

.NET Core 2.1で確認しています。今話題の.NET Core 2.2や.NET Core 3.0 Previewとなるとまた違ってくると思いますので注意してください。

今回はVisual Studio Codeを使ってプロジェクトを作りたいと思います。

ターミナルで下記のように入力して、コンソールプロジェクトを生成します。

dotnet new console

プロジェクトが生成されたら、コードを修正して、下記のように

dotnet run

すれば実行します。

余談になりますが、 Visual Studioを使わず、Visual Studio Codedotnetコマンドを使うとが手っ取り早いです。

.NET Coreが出た時、なんでわざわざdotnetコマンド使うんだ、GUIにしてくれと思ったのですが、わかれば手っ取り早いです。

簡単なソースならば、インテリセンスなしでも、行けるかなと思います。

f:id:rimever:20181222130209p:plain

と言っても、早速、コンパイルエラーになってる奴がここにいましたが。

自己完結型として出力する場合は、

dotnet publish -o outputFolder -r win10-x64

というように指定します。

Visual StudioGUIでも行えるので、詳細はMSDNを確認してみてください。

dotnet publish コマンド - .NET Core CLI | Microsoft Docs

-rでターゲットOSを指定するのですが、それはどこを見ればいいんだ?と思ったのですが、下記の記事を見てください。

.NET Core のランタイム識別子 (RID) のカタログ | Microsoft Docs

Macでしたら下記のようにすればいいですね。

dotnet publish -o outputFolder -r osx.10.13-x64

Linuxもありますが、MacLinuxもOSの前提条件があるので注意が必要です。

自己完結型にした時のファイルサイズ

Left align Right align
自己完結型にしない 5.79KB
win10-x64 66.0MB
osx.10.13-x64 64.5MB

Windows,Mac共に、60MB以上増量されました。

元のアプリがコンソールを1行表示するだけの中身があって内容なアプリなので、ギャップが激しくなってますが、ほとんどのファイルサイズが自己完結型を実現するためのdllのファイルサイズでしょう。

MacWindows比べて、本家のWindowsよりMac OSXの方が多少軽いのか、と。

f:id:rimever:20181222133208p:plain
.

Windowsだけ、MacだけとOSによって入ったり入らなかったりするdllがあるようです。

肝心の.NET Coreインストールされてなくても動くのか?という点については問題なさそうでした。

60MBというサイズについてどう考えるか

後は、使うシチュエーションでの判断なのですが、今の職場としては、かなり大きいという印象です。

私のチームはアプリがさほど多くないのでなんとか入れられなくもないです。

チームによっては10以上のアプリを別々のフォルダで切って展開しているため、アプリごとに自己完結型で展開したら、10*60=600MB増えたりしてしまいかねないことになります。

やるとしても、工夫して使わないとならないですし、そこまでして.NET Coreにいつ切り替えるかという判断もしないとならないでしょう。

といっても、自己完結型は一つの解決策にはなるので期待はしています。