注意
これは書き散らしなので案外すぐにこの記事は使い物にならなくなります。多分。
TL;DR
- 結局ドキュメントの
docs.rs
でお出しされていないコードは参考にしてはならない - 何が変更された追跡してそこだけ現行版にあわせたら別に問題ない話→なのでやっぱりドキュメントが正義
axumのexampleとは
The axum repo contains a number of examples that show how to put all the pieces together.
ここのa number of examples
からGitHubのコードに飛ぶことができ、WebSocketだったりデータベースコネクションだったりいろんなコードの実装例が書かれている素敵なリンクです。
実際にコードを動かしてみる
脳死でコピペして動かしてみましょう 今回はhello-worldを使っています
#...
[dependencies]
axum = "0.6.18"
tokio = { version = "1.15.0", features = ["full"] }
//! Run with
//!
//! ```not_rust
//! cargo run -p example-hello-world
//! ```
use axum::{response::Html, routing::get, Router};
#[tokio::main]
async fn main() {
// build our application with a route
let app = Router::new().route("/", get(handler));
// run it
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
.await
.unwrap();
println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap();
}
async fn handler() -> Html<&'static str> {
Html("<h1>Hello, World!</h1>")
}
実行結果がこちら
dev\rust-play on main [?] is v0.1.0 via v1.68.2
❯ cargo run
Compiling rust-play v0.1.0 (C:\Users\raiga\dev\rust-play)
error[E0425]: cannot find function `serve` in crate `axum`
--> src\main.rs:13:11
|
13 | axum::serve(listener, app).await.unwrap();
| ^^^^^ not found in `axum`
For more information about this error, try `rustc --explain E0425`.
error: could not compile `rust-play` due to previous error
というように、存在しないよ~という風に言われます。
Exampleなのになぜ動かないのか
そんなのExampleの意味ないじゃないか!って思ったりもしますが、おちついて色々調べてみる
-
axum
のバージョンは0.6.18
- 最新の
0.6.18
のドキュメントにはまずaxum::serve
の項目はない
というわけでまぁあたりまえの話なんですけど、「そのバージョンにそんな機能はないよ!」という話でした
そしてGitHubの最終のファイルのコミットを追ってみると、あるPRのコミットにより現行のバージョンにない機能を使っているようです。
このPRを見る限り、新しいv0.7
への機能改善だと思われるのですが、何故かマージしている先のブランチが404なので、これの機能が結局次のリリースなどで実装されるのかは不明なのに、そのままにされているみたい・・・・・・?
結局どうするのか
今回注目した部分での改変は現行版が
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
を
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
.await
.unwrap();
axum::serve(listener, app).await.unwrap();
と変更されているようなので、そこは変更すればいいでしょう。
まだ全部のExampleを見ていないので、もしかしたらまだ他にも実装が宙ぶらりんでエラーになる機能もあるかもしれないので、他のところも一度実装例をそのまま動かしてみて、そこから動く部分を参考にするようにすればいいと思います。
なのでまずはきちんとドキュメント、読もう!
追記 ブランチ選択
今自分の使いたいバージョンに合わせてブランチを切り替えればその時のバージョンの使用例にできます(でもドキュメントのリンクもできればバージョンにあわせてほしいよなーなんて思っていません)