blog.yuzu441.com

rust axumをbaconでlive-reloadする

tags: rust

最近個人的にrustのwebフレームワーク axum を触ってみていて、変更に対してライブリロードしてくれるツールを探したところ cargo-watch が定番のようだったが、アーカイブされていて代わりにbaconを勧めていたので、baconでライブリロードをやろうとしたところ地味にハマったので書く

Bacon

自分用にaxumのインストールから始めるのでbacon部分だけが知りたい場合は読み飛ばしてください

必要なライブラリのインストール

とりあえずaxumでhello worldが返るAPIを用意する

cargo init .
cargo add axum
cargo add tokio --features macros,rt-multi-thread

ライブラリは用意できたのでsrc/main.rsにコードを書く

use axum::{routing::get, Router};

#[tokio::main]
async fn main() {
    let app = Router::new().route("/", get(|| async {"hello world"}));

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

実行してhello worldが返ることを確認する

cargo run

# 別ターミナルから
curl http://localhost:3000

hello worldが返ってくるので次にbaconをインストールする

baconの準備

install

cargo install --locked bacon

baconではコマンドをjobと呼んでいてbacon testなどデフォルト設定のままであればインストールが終われば動かせる。が、ここからがハマったところでrunコマンドをwatchさせる方法がドキュメント上で見つけられず、helpを読むことで実行中にrを押すかbacon -j runのように実行するとwatchできる

ただこれだと上記のaxumコードは変更しても検知されず、再ビルドも行われず、helpにも書かれていない?がbaconのデフォルト設定を眺めていると[jobs.run-long]という定義がありこれを試した所うまく動作した

bacon/defaults/default-bacon.toml at main · Canop/bacon

bacon -j run-long

まとめ

最初動かなくてcargo-watch使うか、自分で設定書いてやるしかない?と思ったけどデフォルトで動いてよかった。

結局未だにrun-longの説明どこに書いてあったのか見つけられていないので書いていないのであればどこかに書いていてほしい。。