はじめに
dotNet Coreで作成したコントロールアプリを他のPCでも動くようにしたく、自己完結型でどうやって発行するのか参考にした記事のメモです。
自己完結型で発行とは
dotNetを使用して作成したアプリはフレームワーク依存と自己完結型の2つのモードで発行することができます。
-
フレームワーク依存の発行
利用者側にdotNetの環境がインストールされていることを前提に実行ファイルだけの小規模な形でアプリを発行する。
デメリットとして、利用者側にdotNetの環境がインストールされていない場合にアプリが動作しない。 -
自己完結型の発行
利用者側にdotNetの環境がインストールされていなくても実行できる形でアプリを発行する。
デメリットとして、追加されるdotNet環境の情報が非常に大きい。
(一例として、今回自分が作成したアプリの実行ファイル一式は3MBほどでしたが、自己完結型にすると70MB近くになりました。)
参考記事:
VisualStudioで発行する
プロジェクトの右クリックから「発行」を選んで設定をポチポチしていけばできます。
参考記事:
コマンドラインから発行する
dotnetコマンドを利用して発行することができます。
dotnet publish -r win-x64
コマンドラインからの発行ですが、今回はwindows用とlinux用の2つ用意したく、さらにGitHubにアップロードしたかったためzip圧縮までしてくれるバッチファイルも作りました。
リポジトリのトップに格納する想定です。(1、2、3のところは書き換えてください。)
@echo off
rem 自己完結型でwin-x86とlinux-x64向けに発行し、GitHubにアップロードするためにzip圧縮するバッチファイル
dotnet publish (1) -o (2) -c Release --self-contained=true -r linux-x64 -p:PublishSingleFile=true -p:PublishTrimmed=true
powershell Compress-Archive -Path (2) -DestinationPath (2).zip -Force
dotnet publish (1) -o (3) -c Release --self-contained=true -r win-x86 -p:PublishSingleFile=true -p:PublishTrimmed=true
powershell Compress-Archive -Path (3) -DestinationPath (3).zip -Force
@echo --- Finished ---
pause > nul
(1):Project/Solutionを指定しています。
例えばsrc/Application.csproj
やsrc/Application.sln
です。
(2):linux-x64形式での出力パスを指定しています。
例えばsrc/Application/bin/Release/linux-x64-publih
です。
指定しなくてもRelease以下のところにlinux-x64/publish
で出力してくれますが、
複数発行する際には名前を区別できるようしたほうが良いと思います。
(3):win-x86形式での出力パスを指定しています。(2)と大体同じです。
今回使用したdotnetのpublishコマンドについてのメモ
詳細:https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-publish
-
dotnet publish [<PROJECT>|<SOLUTION>]
プロジェクトまたはソリューションを指定して発行します。
指定しないと現在の作業ディレクトリが設定される -
-o <OUTPUT_DIRECTORY>
出力ディレクトリのパスを指定します。
自己完結型の実行可能ファイルの場合、既定値は [project_file_folder]/bin/[configuration]/[framework]/[runtime]/publish/ に設定されます。 -
-c <CONFIGURATION>
ビルド構成を定義します。 既定値は Debug です。 -
--self-contained=true
trueで自己完結型、falseでフレームワーク依存になります。
true (自己完結型) の場合は-r
オプションが必須になります。 -
-r <RUNTIME_IDENTIFIER>
指定されたランタイムのアプリケーションを発行します。
上記の例だとwin-x86
とlinux-x64
を指定しました。
詳しくは公式を参照ください:https://docs.microsoft.com/ja-jp/dotnet/core/rid-catalog -
-p:PublishSingleFile=true
ファイル一式をまとめたかたちに出力されます。(もろもろのDLLが1つのApplication.exeだけになる)
若干ですが、ファイルサイズも小さくなります。 -
-p:PublishTrimmed=true
不要なDLLを抑制してファイルサイズを小さくできます。
今回作成したアプリは70MB→40MBくらいになりました。
最後の2つはこちらを参考にしました:https://tech.guitarrapc.com/entry/2019/08/19/003131#SCD-1
powershell Compress-Archive
というのはコマンドライン上でzip圧縮を行うには別途インストールが必要となるためPowerShellで行うためのコマンドです。
-Path
にzip圧縮の対象を指定し、-DestinationPath
に出力先を指定します。
-Force
をつけると既存ファイルがあった場合に上書きする設定になります。