もくじ
https://tera1707.com/entry/2022/02/06/144447
やりたいこと
.netのプロジェクトをビルド&成果物(exeファイルなど一式)を作成するときに、
- PublishSingleFileでファイルをひとまとめにしたいのに、
- dotnet publish に
-p:PublishSingleFile=true
とかのパラメータをつけてもどうにもsigleファイルになってくれない - でも、VSの「発行」からは、うまくsingleファイル化して出力できる
ということがあった。
しばらくパラメータをいろいろ試したけどどうにうまくいかなかったので、あきらめて↓の方法でやることにした。
https://learn.microsoft.com/ja-jp/dotnet/core/tools/dotnet-publish#pubxml-files
ざっくりいうと、
- VisualStudioのcsprojの「発行」を行う
- 「発行」をすると
<project_folder>/Properties/PublishProfiles/FolderProfile.pubxml
ができるので、 dotnet publish -p:PublishProfile=FolderProfile
で、pubxmlを使ってpublishする。
ということ。
やりかた
「発行」というのはコレ。
C#のプロジェクトを右クリックしたら出てくるコレ。
「発行」を押すと、↓のような画面が出てくる。
「フォルダー」を選択して「次へ」を押す。
さらに「フォルダー」をおして「次へ」を押す。
「フォルダーの場所」に出力したいパスを入れて、「完了」を押す。
※今回は、bat、csprojと同じ階層のpublishフォルダに出力されるように下図のように設定した。
次に出てくる画面で、「①すべての設定を表示」を押して、出てきた「プロファイル設定」で必要な設定をして「②保存」を押す。
そのようにして設定して、右上の「③発行」を押すと、「ターゲットの場所」で設定したフォルダに、exe一式が保存される
で、これでやった設定は、SingleFile化されてる。
(ランタイム等の依存ファイルがexeの中に入って、出力ファイル数が少ない。SingleFileといいつつ1ファイルだけ、ではないけど、それはそういうもんなんでしょう。。。)
こうして発行すると、
<project_folder>/Properties/PublishProfiles/FolderProfile.pubxml
というファイルができていて、そこには下記のような設定がされてる。
<?xml version="1.0" encoding="utf-8"?> <!-- https://go.microsoft.com/fwlink/?LinkID=208121. --> <Project> <PropertyGroup> <Configuration>Release</Configuration> <Platform>x64</Platform> <PublishDir>publish\</PublishDir> <PublishProtocol>FileSystem</PublishProtocol> <_TargetId>Folder</_TargetId> <TargetFramework>net8.0-windows</TargetFramework> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <SelfContained>true</SelfContained> <PublishReadyToRun>true</PublishReadyToRun> <PublishSingleFile>true</PublishSingleFile> </PropertyGroup> </Project>
これを、batファイルの中のdotnet publish
で使ってやる。
csprojと同じ階層にbatを置く前提で、下記のようなbatにする。
rem publish with seting in /Properties/PublishProfiles/FolderProfile.pubxml dotnet publish -p:PublishProfile=FolderProfile pause
こうやると、<project_folder>/Properties/PublishProfiles/FolderProfile.pubxml
に書いた(というかVSが生成した)設定で、publishしてくれる。
これだと、ちゃんとSingleFileになってくれる。
おわり
おそらく、ちゃんとdotnet publish のパラメータを設定してやれば、pubxmlを使わなくてもうまくSingleFileになると思うのだが、なんとなくこちらがVS経由でできたpubxmlを使ってpublishできるので安心感がある。
msdocsのdotnetコマンドのリファレンス、難易度が高い、、、
参考
dotnet publish コマンド
https://learn.microsoft.com/ja-jp/dotnet/core/tools/dotnet-publish#pubxml-files