npm run tauri dev で動いているアプリを、ユーザーに渡せる形(.exe / .msi / .dmg / .deb / .AppImage など)にするのが tauri build です。フロントエンドのビルド、Rust のリリースコンパイル、OS ごとのバンドル生成を 1 コマンドで行います。ここでは内部の流れと主要オプション、初回ビルドで引っかかりやすい設定ミスを扱います。
前提条件
プラグインは不要です。ただしビルドは配布対象の OS 上で行います(Windows 用は Windows、.dmg は macOS、.deb / .AppImage は Linux)。クロスビルドは NSIS を除き非対応です。
1. ビルドコマンドと内部の流れ
npm run tauri build
build.beforeBuildCommand(テンプレートではnpm run build)を実行し、フロントエンドをbuild.frontendDist(例:../dist)に出力する- その中身を埋め込んで
cargo build --releaseでコンパイルする bundle.targetsに従って OS 用のバンドルを生成する
dev と違い、フロントエンドは静的ファイルとして埋め込まれるため、devUrl にしか存在しないパスや import.meta.env.DEV 前提のコードは本番では動きません。
debug と release の違い
npm run tauri build -- --debug
--debug を付けると Rust が debug プロファイルでコンパイルされ、出力先が target/debug/ になります。最適化が入らないぶんビルドが速く、release では無効になる WebView の開発者ツールも開けるので、「本番ビルドでだけ起きる問題」の切り分けに使います。
ターゲットとバンドル形式を絞る
# Apple Silicon と Intel 両対応のユニバーサルバイナリ (macOS)
npm run tauri build -- --target universal-apple-darwin
# Windows で NSIS だけ作る(MSI をスキップ)
npm run tauri build -- --bundles nsis
# バンドルを作らず実行ファイルだけ生成する
npm run tauri build -- --no-bundle
--target には target triple を指定し、事前に rustup target add <triple> を済ませておきます。--bundles は bundle.targets をコマンドラインから上書きするもので、CI で形式ごとにジョブを分けるときに使います。npm run 経由ではオプションを -- の後ろに書きます。
2. tauri.conf.json で確認しておく項目
{
"productName": "my-notes",
"version": "1.0.0",
"identifier": "jp.example.mynotes",
"build": {
"beforeBuildCommand": "npm run build",
"frontendDist": "../dist"
},
"bundle": {
"active": true,
"targets": ["nsis", "msi"]
}
}
identifier: 逆ドメイン形式で一意な値。テンプレートのcom.tauri.devのままではビルドが拒否されるversion: バンドルのバージョン。省略するとCargo.tomlのversionが使われるbundle.targets:"all"か形式名の配列。作らない形式を外すとビルド時間が縮む
動作確認
ビルドが終わると、ログの末尾に生成物のパスが並びます。
Finished 2 bundles at:
C:\work\my-notes\src-tauri\target\release\bundle\msi\my-notes_1.0.0_x64_en-US.msi
C:\work\my-notes\src-tauri\target\release\bundle\nsis\my-notes_1.0.0_x64-setup.exe
実行ファイル単体は src-tauri/target/release/<productName>(Windows は .exe)、バンドルはその下の bundle/<形式名>/ です。--target を指定すると target/<triple>/release/ に変わります。生成物はクリーンな VM で 1 度は動かしてください。
よくあるエラーと対処法
identifier がデフォルトのまま
identifier が com.tauri.dev のままだと、「The default value com.tauri.dev is not allowed as it must be unique across applications」という趣旨のエラーで止まります。jp.example.appname のような一意の値に変更してください。末尾が .app の identifier も macOS で警告されるので避けます。
frontendDist のパスが存在しない
beforeBuildCommand の出力先と frontendDist が食い違っていると、「frontendDist に設定されたパスが存在しない」という趣旨のエラーになります。Vite の build.outDir を変えたのに frontendDist を直し忘れた、または beforeBuildCommand が空、のどちらかがほとんどです。frontendDist は src-tauri/ からの相対パスなので、通常は ../dist のように .. から始まります。
ビルドが遅い
初回は依存クレートをすべてコンパイルするため数分〜十数分かかりますが、2 回目以降は差分ビルドです。target/ を消さない、CI でキャッシュする、bundle.targets を絞る、で短縮できます。最適化プロファイルの調整は Rust バイナリを最適化して小さくする を参照してください。
OS ごとの違いと注意点
- Windows: 既定で NSIS (
-setup.exe) と MSI の両方が作られます。WiX と NSIS 本体は初回ビルド時に CLI が自動ダウンロードします - macOS:
.appと.dmgが作られます。未署名のアプリは配布先で Gatekeeper にブロックされるため、Developer ID 署名と公証が別途必要です - Linux: ビルド環境の glibc / WebKitGTK のバージョンが最低動作要件になるため、サポートしたい最も古いディストリビューションでビルドするのが原則です
- リリースごとに
versionを上げないとインストーラーの上書き判定が効かないので注意してください
