cargo-watch、やめるってよ
Rustを書いてると、気づくんですよね。保存ボタンを押すたび、手動でcargo checkとかcargo testとか叩いてる自分に。「あれ、俺って原始人だっけ?」みたいな気持ちになる。そこで救世主として現れたのがcargo-watchだったわけです。過去形。
そう、cargo-watchはもうメンテされてないんです。引退しちゃった。
ここで一旦、真面目な話を。10年以上もcargo-watchとwatchexecっていうOSSプロジェクトを守り続けてきたFélix Saparelliさんに、心から敬意と感謝を。あなたのおかげで、世界中の無数のRust開発者が「あ、これ便利じゃん」って生産性爆上げできたんです。本当にありがとうございました。
で、公式READMEには作者本人がこう書き残してる。
"It's time to let it go. Use Bacon. Remember Cargo Watch."
なんかもう、エモすぎません?10年以上続いたプロジェクトが、バトンを次世代に渡して静かに去っていく感じ。その後継者がbacon。そして汎用性の塊みたいなwatchexec。ベーコンって名前、朝ごはん感あるけど、これが本当にすごいんですよ。
というわけでこの記事では、Rust開発で使えるファイル監視ツールについて解説していきます。cargo-watchロス、今日で終わりにしましょう。
baconって何?
baconは、Rust専用に作られたバックグラウンドコードチェッカーです。エディタの隣で動かしておくと、ファイルを保存するたびに自動でコンパイルチェックを走らせて、エラーや警告をリアルタイムで表示してくれます。
cargo-watchとの違い
cargo-watchの作者が「baconこそが自分の理想だった」と語っているほど、baconは進化しています。
- TUIで見やすい - エラーが警告より先に表示され、スクロール不要
- キーボード操作 -
tでテスト、cでClippy、dでドキュメントと一瞬で切り替え - 小さい画面でも快適 - ターミナルのサイズに合わせて表示を最適化
- Rust Analyzerと競合しない - 開発体験がスムーズ
インストール
# 基本インストール cargo install --locked bacon # オプション機能も入れる(クリップボード、サウンド) cargo install --locked bacon --features "clipboard sound"
基本的な使い方
プロジェクトのルートでbaconを起動するだけ。
cd your-rust-project bacon
デフォルトではcargo checkが走ります。ファイルを保存すると自動で再チェック。

主要なキーボードショートカット
baconの真価はキーボードショートカットにあります。
t- テスト実行に切り替えc- Clippyに切り替えd- ドキュメントをブラウザで開くf- テスト失敗時、そのテストだけに絞り込みEsc- 前のジョブに戻るCtrl+j- すべてのジョブ一覧を表示h- ヘルプ表示q- 終了
特定のジョブで起動
# テストを監視 bacon test # Clippyを監視 bacon clippy # 厳格なClippyルール(pedantic) bacon pedantic # 高速テストランナー(nextest) bacon nextest # すべてのターゲットをチェック bacon check-all # 特定のジョブを指定 bacon --job my-custom-job
bacon.toml で設定をカスタマイズ
プロジェクトに合わせてジョブを定義できます。
# 設定ファイルを生成 bacon --init
設定例
# bacon.toml
# Windows向けのチェック
[jobs.check-win]
command = ["cargo", "check", "--target", "x86_64-pc-windows-gnu"]
# 厳しめのClippy
[jobs.clippy-strict]
command = [
"cargo", "clippy", "--",
"-D", "warnings",
"-A", "clippy::collapsible_if",
]
need_stdout = false
# サンプルをチェック
[jobs.check-examples]
command = ["cargo", "check", "--examples", "--color", "always"]
watch = ["examples"] # srcは自動で監視される
# 実行ジョブ
[jobs.run]
command = ["cargo", "run"]
allow_warnings = true
need_stdout = true
# キーバインディングのカスタマイズ
[keybindings]
shift-c = "job:clippy-strict"
r = "job:run"
設定しておいてよいこと
ドキュメントを素早く確認
[jobs.doc-open] command = ["cargo", "doc", "--no-deps", "--open"] need_stdout = false on_success = "back" # ドキュメントが開いたら前のジョブに戻る
長時間実行するアプリケーション
[jobs.server] command = ["cargo", "run"] allow_warnings = true need_stdout = true background = false on_change_strategy = "kill_then_restart"
watchexecとの使い分け
baconはRust専用ですが、watchexecは汎用的なファイル監視ツールです。
watchexecを使うべき場合
# インストール cargo install watchexec-cli # 基本的な使い方 watchexec --restart cargo run # 特定の拡張子だけ監視 watchexec -e rs,toml cargo test # デバウンス設定 watchexec -d 2000 cargo check
watchexecが向いているケース: - Rust以外の言語やツール - シェルスクリプトの実行 - rsyncなどの同期処理 - より細かい制御が必要な場合
# 例:TypeScriptのビルド watchexec -e ts,tsx npm run build # 例:ファイル同期 watchexec -w src -- rsync -avhP ./src/ ./backup/
実践的なワークフロー
開発時のセットアップ
bacon # デフォルトでcheckが走る
コードを書く
- 保存すると自動でチェック
- エラーがあれば即座に表示
- エラーが消えたらClippyの警告が見える
テストを書く
tキーでテストモードに切り替え- 失敗したら
fで絞り込み - 修正したら
Escで全テストに戻る
最終チェック
cキーでClippyの提案を確認- コード品質を向上
ちょっとしたTips
シェルエイリアスで効率化
頻繁に使うコマンドをエイリアス化すると便利です。
# ~/.zshrc または ~/.bashrc に追加 alias bac='bacon' alias bacc='bacon clippy' alias bact='bacon test' alias bacp='bacon pedantic'
watchexecで複数パスを監視
# srcとtestsディレクトリの.rsと.tomlファイルを監視 watchexec -e rs,toml -w src -w tests -- cargo test
Vim/Neovimとの連携
nvim-bacon プラグイン
baconの診断結果をNeovimに統合するプラグインがあります。
" lazy.nvim の場合 { 'Canop/nvim-bacon', config = function() require('bacon').setup() end }
主な機能は以下の通り。
- エラー箇所へのジャンプ
- Quickfixへの統合
:Baconコマンドでbaconを起動:BaconLoadで診断結果を読み込み
補足:VS Code向け
VS Codeユーザーの場合は、bacon-lsというLanguage Serverが利用可能です。
まとめ
cargo-watchの時代は終わりました。でも、より良いツールが生まれています。
こう使い分けよう:
Rust開発 → bacon一択
- TUIが快適
- キーボードだけで完結
- 設定ファイルで柔軟にカスタマイズ
それ以外 → watchexec
- 汎用的に使える
- シンプルで強力
- シェルスクリプトとの相性抜群
baconを知らずにRustを書いていた人は、今すぐ試してください。開発体験が一段階レベルアップします。
cargo install --locked bacon cd your-project bacon
たったこれだけ。あとはコードを書くだけです。
参考リンク: - bacon公式サイト - watchexec GitHub - cargo-watch(アーカイブ済み)