「Tauriでデスクトップアプリを作ったはいいけど、外部のCLIツールはどうやって一緒に配布するの?」
そんな疑問、持ったことありませんか? 実は Tauri v2 には「Sidecar(サイドカー)」という仕組みがあって、ffmpegやfrpcのような外部バイナリをアプリにまとめて同梱できるんです。今回はその仕組みと実装のポイントを、ざっくりわかりやすく解説します 🚀
Sidecarってそもそも何?

イメージとしては、アプリのパッケージの中に「おまけの実行ファイル」を一緒に入れておいて、必要なときにアプリ側から呼び出す、という感じです。つまり、ユーザーが別途インストールしなくても、CLIツールをそのまま使えるようになるわけですね。
Tauri v2では、この仕組みが公式でサポートされています。対応しているのは Windows・macOS・Linux の各プラットフォームで、それぞれに合ったバイナリを用意する必要があります。
設定の流れをざっくり確認 📋
ポイントをまとめるとこんな感じです。
- ✅
tauri.conf.jsonにexternalBinを追加する - ✅ バイナリをプラットフォームごとに命名規則に合わせてリネームする
- ✅
capabilitiesでSidecar実行の権限を設定する - ✅ Rustコード側から
Command::new_sidecar()で呼び出す
実際の設定コード例
まず tauri.conf.json にバイナリのパスを登録します。ここが重要です 👇
{
"bundle": {
"externalBin": [
"binaries/frpc"
]
}
}
次に、Rustのコードでバイナリを呼び出します。
use tauri_plugin_shell::ShellExt;
// Sidecarを呼び出すコマンド例
#[tauri::command]
async fn run_frpc(app: tauri::AppHandle) -> Result<String, String> {
let sidecar_command = app
.shell()
.sidecar("frpc") // ← binaries/frpc を指定
.map_err(|e| e.to_string())?
.args(["--config", "frpc.ini"]); // 引数も渡せる
let (mut rx, _child) = sidecar_command
.spawn()
.map_err(|e| e.to_string())?;
// 出力をそのまま返す(簡易版)
Ok("frpc started!".to_string())
}
ここでのポイントをまとめるとこんな感じです。
sidecar("frpc")の文字列はバイナリ名(拡張子なし)でOK.args()でCLI引数を配列で渡せるspawn()で非同期実行、標準出力も受け取れる
ハマりやすいポイント ⚠️
実際に試すといくつか詰まりやすいポイントがあります。確認しておきましょう。
- ❗ バイナリのファイル名は
frpc-x86_64-apple-darwinのようにターゲットトリプルを付ける命名規則がある - ❗ macOSでは コード署名 が必要になる場合がある
- ❗
capabilitiesの設定でshell:allow-executeを忘れると動かない
まとめ
Tauri v2のSidecar機能を使えば、ffmpegやfrpcのような外部CLIバイナリをアプリにまとめて同梱でき、ユーザーが別途インストールしなくていい体験を提供できます。設定ファイルとRustコードの両方を正しく組み合わせるのがコツですね 💡
デスクトップアプリ開発の幅がぐっと広がるので、ぜひ一度試してみてください! Tauri v2の公式ドキュメントも合わせて読むと、より理解が深まりますよ。





