本番用にアプリをビルドする

npm run tauri build で配布用のバイナリとインストーラーを作る。--target / --bundles / --debug の使い分け、出力先、ビルドが止まるときの直し方を示す。

ビルド・配布 対象: Tauri 2.x 更新日: 読了目安: 約5分 build-001
目次
  1. 前提条件
  2. 1. ビルドコマンドと内部の流れ
  3. debug と release の違い
  4. ターゲットとバンドル形式を絞る
  5. 2. tauri.conf.json で確認しておく項目
  6. 動作確認
  7. よくあるエラーと対処法
  8. identifier がデフォルトのまま
  9. frontendDist のパスが存在しない
  10. ビルドが遅い
  11. OS ごとの違いと注意点
  12. 関連レシピ

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
  1. build.beforeBuildCommand(テンプレートでは npm run build)を実行し、フロントエンドを build.frontendDist(例: ../dist)に出力する
  2. その中身を埋め込んで cargo build --release でコンパイルする
  3. 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 を上げないとインストーラーの上書き判定が効かないので注意してください

関連レシピ

参考リンク(公式ドキュメント)

Web Ninja

この記事を書いた人

Web Ninja ウェブエンジニア (Web Engineer)

会社員ネットワークエンジニアから独立してかれこれ 25 年以上 Web エンジニアとして活動中。普段は JavaScript と Node.js を自在に操り、時には C++ や Perl といった古流の技も嗜みます。近年は Tauri × Rust という新たな武器を手に、デスクトップアプリ開発の最前線を駆け抜けています。「作りたい」を「作れる」に変えるための、実践的な「技」をお届けします。

お問い合わせ: tauri.ninja@gmail.com

内容の誤り・動かないコードを報告する