-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
3.5 channel=1.78.0 だと sqlx-core の推移的依存関係でビルドできない状態 #9
Comments
ありがとうございます! |
原因の説明と解決策書籍で使用しているsqlxのバージョン0.7.4では、内部のクレートであるsqlx-coreがurlクレートを 解決策としては、次のどれかを推奨します。
adapterクレートに所定の依存を加える著者にとってはこれが一番早いかもしれません。このリポジトリの実装も、後日これに倣って直しておこうと考えています。 adapterクレートの [dependencies]
kernel.workspace = true
shared.workspace = true
async-trait.workspace = true
bcrypt.workspace = true
chrono.workspace = true
derive-new.workspace = true
secrecy.workspace = true
sqlx.workspace = true
redis.workspace = true
# 追加
url = "~2.2.2" lockfileに対して所定の編集を加える今回問題となっているurlとidnaのクレートのバージョンを直接編集して書き換える方法がまず考えられます。あまり推奨された方法ではないかもしれませんが、一応動作させる事はできます。
rust-toolchain.tomlのバージョンを1.81.0に上げる読者のみなさんにとってはこれが最もシンプルな解決策になると思います。 [toolchain]
channel = "1.81.0"
profile = "default" 報告いただいた方の指摘とは異なり、単にバージョンを上げるのみでよさそうです。そう考えている理由は「補足」を参照してください。 詳細な経緯の説明エラーの意味するところと、各クレートでのGitHub上での議論を追った結果を残しておきます。詳細な経緯に興味のある方は御覧ください。 エラーの意味するところまずエラーの意味するところですが、
実は、この Rust 1.81.0以上にすると、このエラーが検出されなくなるのは、安定化されたためということになります。 sqlx-coreのコンパイラフィーチャーフラグの指定方法が原因なのではないか?ではなぜ、標準ライブラリしか用いないと想定されるsqlxのようなクレートにおいて、上述したような これについては、概ね下記のような経緯があったと推察されます。
idnaクレートでの変更直接の原因となったのはidnaクレートに対する変更です。下記のようなPull Requestがマージされており、現在最新バージョンである1.0.3ではこの実装が含まれています。 この実装では次のようなコードが追加されています。このコードの意味するところは、
というものです。 #[cfg(feature = "std")]
impl std::error::Error for Errors {}
#[cfg(not(feature = "std"))]
impl core::error::Error for Errors {} このクレートの修正内容は、urlクレートのバージョン sqlx-coreからのurlクレートへの依存sqlxのバージョン0.7.4では、sqlx-coreにおけるurlクレートへの依存は次のように設定されています。
なお、
ところで、urlクレートのデフォルトフィーチャーの指定は下記のように、
書籍執筆時点では影響しなかった理由単にsqlx-coreがurlの cargoでは依存関係をツリー上で出力する方法として、 書籍執筆時点
現在
sqlx側の対応sqlx側ではこの問題を認識しており、すでにmainブランチの実装では 確認時点での最新のmainブランチの状況 補足@mizchi おそらく、1.81.0に上げることと このIssueを作成された時点でmizchiさんが取り組まれていたのは、推測するに3章でヘルスチェックを追加する付近だと思いますが、ヘルスチェック用の関数が書かれたページの直前のコードブロックに、 |
問題
20241207現在、この sqlx-core の内部依存の変更を受け、書籍の手順を 1.78.0 で動かすことは出来ません。
sqlx-core -> url -> idna が 1.81.0 以降を要求します。
再現方法
rust-toolchain.toml で 1.78.0 を指定したまま、Cargo.lock を削除して cargo build し直すと、ビルドに失敗します。
自分は書籍を読みつつこのリポジトリからコードをコピーして手順を再現しようとしたので、Cargo.lock だけ無視したのでこの状態になりました。
問題の発生理由
sqlx-core が依存する url crate は "version"="^2.2.2" が指定されており、今の状態で更新すると 2.5.2 から 2.5.4 に上がります。その推移的依存関係の idna が 0.5.0 -> 1.0.7 に更新され、これは 1.81 以降でしかビルドできません。
対応案
この本の手順を再現するために 1.78.0 を指定すると、Cargo.lock を移植しない限り、逆に動かない状態になります。
1.78.0 のままで動かすワークアラウンドとして、このリポジトリのCargo.lock をコピーすると問題を回避できるのは確認できています。
じゃあ 1.81.0 にあげるとそのまま解決するかと言うと、次の use が追加で必要になりました。
これは
async fn health_check_db(State(db): State<PgPool>) -> StatusCode {
でパターンマッチするための State の参照の解決ですが、マクロ解決か何かの影響を受けて書籍のコードは動きません。なので、いずれにせよ何らかの対応をしないとこのリポジトリを動かすことができません。
use axum::extract::State;
を追加するThe text was updated successfully, but these errors were encountered: