auto-reload
This example shows how you can set up a development environment for your axum
service such that whenever the source code changes, the app is recompiled and
restarted. It uses listenfd
to be able to migrate connections from an old
version of the app to a newly-compiled version.
Setup
cargo install cargo-watch systemfd
Running
systemfd --no-pid -s http::3000 -- cargo watch -x run
[package]
name = "auto-reload"
version = "0.1.0"
edition = "2021"
publish = false
[dependencies]
axum = { path = "../../axum" }
listenfd = "1.0.1"
tokio = { version = "1.0", features = ["full"] }
//! Run with //! //! ```not_rust //! cargo run -p auto-reload //! ``` use axum::{response::Html, routing::get, Router}; use listenfd::ListenFd; use tokio::net::TcpListener; #[tokio::main] async fn main() { // build our application with a route let app = Router::new().route("/", get(handler)); let mut listenfd = ListenFd::from_env(); let listener = match listenfd.take_tcp_listener(0).unwrap() { // if we are given a tcp listener on listen fd 0, we use that one Some(listener) => { listener.set_nonblocking(true).unwrap(); TcpListener::from_std(listener).unwrap() } // otherwise fall back to local listening None => TcpListener::bind("127.0.0.1:3000").await.unwrap(), }; // run it println!("listening on {}", listener.local_addr().unwrap()); axum::serve(listener, app).await.unwrap(); } async fn handler() -> Html<&'static str> { Html("<h1>Hello, World!</h1>") }