build-windows-exe について
XerahS の x64 および ARM64 向け Windows インストーラーを作成するビルド自動化スキルです。順次パッケージ化、ファイルロックの復旧、成果物の新しさの確認方法を説明します。
主な機能
- 01Windows x64 と ARM64 のパッケージ化
- 02ファイルロックの復旧手順
- 03ARM64 手動発行の代替手順
- 04インストーラー成果物の検証
活用シーン
- 01両アーキテクチャ向け Windows インストーラーのビルド
- 02コンパイル時のファイルロックの調査
- 03インストーラーの存在とタイムスタンプの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sharex/ xerahs --skill build-windows-exeインストール後、Claude Code で/build-windows-exeを入力して読み込まれたか確認します。
詳細
.NET プロジェクトの Windows ビルド自動化に精通したエキスパートです。
一般的なファイルロックの問題を回避しながら、XerahS の Windows 実行ファイルをビルドするため、以下の手順に正確に従ってください。
x64 と ARM64 の両アーキテクチャ向け Windows インストーラーをビルドします。 コンパイル中によく発生するファイルロックの問題に対処します。 Inno Setup でインストーラーの実行ファイルを正常に作成できるようにします。 ビルド成果物が存在し、新しいものであることを検証します。 build\windows\package-windows.ps1 dist ShareX.ImageEditor\src\ShareX.ImageEditor\obj\Release\net10.0-windows10.0.26100.0\ShareX.ImageEditor.dll - XerahS-{version}-win-x64.exe - XerahS-{version}-win-arm64.exe共通のビルドガードレール
Windows のパッケージ作業を始める前に、共通のタイムアウト、ロック復旧、ビルドの同時実行禁止、-m:1、TFM、SkiaSharp のルールについて、build-common に従ってください。この Windows スキルでは、Windows のパッケージコマンド、Inno Setup の動作、Windows 成果物の検証を扱います。
ビルドプロセス
準備
ピン留めされたサブモジュールのリビジョンをビルドしてください。タスクで依頼された場合に限り、オペレーターの Git ラッパーを使用して ImageEditor を更新してください。
これらの出力を共有する別のビルドが実行中でないか確認してください。ロックが発生した場合は、build-common に従ってタスクが所有するロック保持プロセスを特定し、影響を受けた出力のみをクリーンアップしてください。通常のパッケージ作業で、プロセスを一律に終了したりクリーンアップしたりする必要はありません。
フェーズ 2:最初のビルド試行
-
パッケージスクリプトを実行します:
.\build\windows\package-windows.ps1 -
正常に完了したことを確認します:
- スクリプトが終了コード 0 で完了すること
distフォルダーに両方のインストーラーが作成されていること
フェーズ 3:ファイルロックエラーへの対処
次のようなエラーが表示された場合:
CS2012: Cannot open '...ShareX.ImageEditor.dll' for writingThe process cannot access the file ... because it is being used by another processfile may be locked by 'VBCSCompiler' or '.NET Host' or 'csc'
以下の修正を適用してください:
-
build-common に従い、タスクが所有していることを確認できたロック保持プロセスのみを停止します。
-
ロックが解消されない場合は、影響を受けたプロジェクトまたは出力ディレクトリをクリーンアップします。
-
ShareX.ImageEditorプロジェクトを個別に、シングルスレッドで事前ビルドします:dotnet build 'ShareX.ImageEditor\src\ShareX.ImageEditor\ShareX.ImageEditor.csproj' -c Release -p:UseSharedCompilation=false /m:1/m:1フラグにより、ビルドがシングルスレッドで実行されますUseSharedCompilation=falseにより、VBCSCompiler サーバーが無効になります
-
パッケージスクリプトを再実行します:
.\build\windows\package-windows.ps1
フェーズ 4:代替手段 — ARM64 の手動ビルド
x64 は成功するものの、ARM64 が引き続き失敗する場合は、ARM64 を手動でビルドします:
-
build-common に従って、確認済みのロックを解消します。
-
ShareX.ImageEditorを事前ビルドします:dotnet build 'ShareX.ImageEditor\src\ShareX.ImageEditor\ShareX.ImageEditor.csproj' -c Release -p:UseSharedCompilation=false /m:1 -
ARM64 を手動で発行します:
$root = (Get-Location).Path $project = "$root\src\desktop\app\XerahS.App\XerahS.App.csproj" $publishOutput = "$root\build\publish-temp-win-arm64" dotnet publish $project -c Release -p:OS=Windows_NT -r win-arm64 -p:PublishSingleFile=false -p:SkipBundlePlugins=true -p:UseSharedCompilation=false --self-contained true -o $publishOutput -
プラグインを発行します:
$pluginsDir = "$publishOutput\Plugins" New-Item -ItemType Directory -Force -Path $pluginsDir | Out-Null Get-ChildItem "$root\src\desktop\plugins" -Filter "*.csproj" -Recurse | ForEach-Object { $pluginId = $_.BaseName $pluginJsonPath = Join-Path $_.Directory.FullName "plugin.json" if (Test-Path $pluginJsonPath) { $json = Get-Content $pluginJsonPath -Raw | ConvertFrom-Json if ($json.pluginId) { $pluginId = $json.pluginId } } Write-Host "Publishing plugin: $pluginId" dotnet publish $_.FullName -c Release -r win-arm64 -p:UseSharedCompilation=false --self-contained false -o "$pluginsDir\$pluginId" } -
Inno Setup を手動で実行します:
$isccPath = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe" $issScript = "$root\build\windows\XerahS-setup.iss" $version = ([xml](Get-Content "$root\Directory.Build.props")).SelectSingleNode("//Version").InnerText.Trim() $outputDir = "$root\dist" & $isccPath "/dMyAppReleaseDirectory=$publishOutput" "/dOutputBaseFilename=XerahS-$version-win-arm64" "/dOutputDir=$outputDir" $issScript
フェーズ 5:検証
-
両方のインストーラーが存在することを確認します:
Get-ChildItem 'dist' -Filter '*.exe' | Select-Object Name, Length, LastWriteTime | Format-Table -AutoSize -
最近作成されたものであることを確認します(数分以内)
-
想定される出力:
Name Length LastWriteTime ---- ------ ------------- XerahS-{version}-win-arm64.exe ~55-60MB [Today's date] XerahS-{version}-win-x64.exe ~55-60MB [Today's date]
重要な注意事項
ビルドの逐次実行は必須です
ビルドを同時に 2 つ実行してはいけません。 ShareX.ImageEditor は複数の TFM(net9.0、net10.0、net9.0-windows10.0.26100.0、net10.0-windows10.0.26100.0)を対象としており、MSBuild の並列処理によって、すべての TFM が同じ ShareX.ImageEditor.dll 出力パスへの書き込みを競合させ、CS2012 ファイルロックエラーが発生します。
- アーキテクチャ:
package-windows.ps1はforeachでwin-x64、続いてwin-arm64をすでに逐次処理します。並行して 2 回実行しないでください。 - 内部並列処理:
dotnet publishの呼び出しに指定する/m:1で制御します。これにより MSBuild がシングルスレッドで実行され、ビルド内の競合が解消されます。 - ビルド間:連続するビルドセッションの間には、必ず
dotnet build-server shutdownを実行し、VBCSCompiler を終了してください。
ファイルロックが発生する理由
- VBCSCompiler:Roslyn コンパイラーサーバーが、ビルドを高速化するためにアセンブリをキャッシュします
- 並列ビルド:複数のプロジェクトが同じ DLL に同時に書き込もうとします
- 実行中の XerahS インスタンス:Watch Folder デーモンが Debug フォルダーから DLL を読み込みます
- Avalonia デザイナー:コンパイル済み DLL への参照を保持している場合があります
主なビルドパラメーター
-p:UseSharedCompilation=false:VBCSCompiler サーバーを無効にします-p:nodeReuse=false:MSBuild によるビルドノードの再利用を防ぎます/m:1:シングルスレッドビルドを強制します(遅くなりますが、競合状態は発生しません)-p:SkipBundlePlugins=true:カスタム MSBuild ターゲットのパス解決に関する不具合を回避します
ビルドエラーへの対処
- CS2012 エラーが表示されても慌てないでください:ビルドは成功する場合があります
- XerahS.exe が作成されたか必ず確認してください:エラーは再試行中に発生した可能性があります
- 通常の原因は
ShareX.ImageEditorです:TFM の並列ビルド(net9.0、net10.0、Windows SDK あり/なし)が行われます - ARM64 ビルドではロックが発生しやすくなります:x64 の後に実行されるため、プロセスが残っている場合があります
ベストプラクティス
- 必ず最初にフェーズ 1 のクリーンアップを実行してください
- ビルド出力に「file may be locked by」というメッセージがないか確認してください
- 終了コードだけでなく、ファイルが実際に作成されたか確認してください
- ビルド中は VBCSCompiler を終了した状態にしてください
- ビルド前に実行中の XerahS インスタンスをすべて終了してください
成功条件
- ✅ win-x64 と win-arm64 の両方の .exe インストーラーが作成されている
- ✅ ファイルサイズが約 55~60 MB である
- ✅ タイムスタンプが新しい(ビルドセッション中)
- ✅ ビルドプロセス(VBCSCompiler、dotnet、MSBuild)が残っていない
- ✅ Dist フォルダーに想定されるインストーラーファイルが含まれている
トラブルシューティング
| 症状 | 解決策 |
|---|---|
| 「XerahS.exe」が存在しない(Inno Setup) | メインアプリの発行に失敗しています。それ以前のビルドエラーを確認してください |
| CS2012 ファイルロックエラー | VBCSCompiler を終了し、obj フォルダーを削除して、/m:1 を指定して再ビルドしてください |
| インストーラーは作成されたが、タイムスタンプが古い | ビルドがエラーを表示せずに失敗しています。iscc_log_win-{arch}.txt のログを確認してください |
| x64 だけ成功し、ARM64 は失敗する | フェーズ 4 の ARM64 手動ビルド手順を使用してください |
| すべてのビルドが失敗する | ソリューションをクリーンし、ターミナルを再起動して、XerahS インスタンスが実行されていないことを確認してください |
関連ファイル
- 共通のガードレール:build-common
- ビルドスクリプト:build\windows\package-windows.ps1
- Inno Setup スクリプト:build\windows\XerahS-setup.iss
- バージョン設定:Directory.Build.props
- ビルドログ:
build/windows/iscc_log_win-{arch}.txt