diff --git a/examples/auto-reload/Cargo.toml b/examples/auto-reload/Cargo.toml new file mode 100644 index 0000000000..dad614a2b9 --- /dev/null +++ b/examples/auto-reload/Cargo.toml @@ -0,0 +1,10 @@ +[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"] } diff --git a/examples/auto-reload/README.md b/examples/auto-reload/README.md new file mode 100644 index 0000000000..b49784ddda --- /dev/null +++ b/examples/auto-reload/README.md @@ -0,0 +1,18 @@ +# 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 + +```sh +cargo install cargo-watch systemfd +``` + +## Running + +```sh +systemfd --no-pid -s http::3000 -- cargo watch -x run +``` diff --git a/examples/auto-reload/src/main.rs b/examples/auto-reload/src/main.rs new file mode 100644 index 0000000000..5813ec1ff1 --- /dev/null +++ b/examples/auto-reload/src/main.rs @@ -0,0 +1,31 @@ +//! Run with +//! +//! ```not_rust +//! cargo run -p example-hello-world +//! ``` + +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) => 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("