KameWalk

Rustのライブラリchronoで破壊的変更があったので困った話

GitHub

最近 Rust の勉強でもしようかなと突然思い立ったので、ちょこちょこ勉強してます。 Tour of Rustだったり Zenn で公開されているRust入門を読んで、基本的な文法はなんとなく頭に入ったかなというレベルになったのでプログラミング Rust 第2版を読みはじめました。

とりあえずサンプルコードとか動かしつつ読み進めてると、2 章でエラーが出て動かないコードに遭遇しました。自分のコードがおかしいのかと思って書籍のコードをコピペしたんですが動かなかったので、これはおかしいなと調べたところ、どうやら 2 章で利用するライブラリで破壊的変更があったらしいです。

変更があったのは chronoという日付や時刻などを扱うライブラリで、0.4.30 で破壊的な変更が行われています。この変更はGitHubのissueで報告されており、依存していた time モジュールの脆弱性の影響を防ぐために行われたようです。前述の issue の中でも触れられていますが、time モジュールは紆余曲折あったっぽいです。

肝心のサンプルコードの動かし方ですが、chrono のバージョン 0.4.30 で破壊的変更が入ったので、0.4.29 に固定してあげればいいです。なので、Cargo.toml

[dependencies]
actix-web = "1.0.0"
serde = { version = "1.0", features = ["derive"] }

こちらから以下のように変更します。

[dependencies]
actix-web = "1.0.0"
chrono = { version = "= 0.4.29" }
serde = { version = "1.0", features = ["derive"] }

actix-web が chrono を内部で利用していて、上記のように書き加えないと chrono のバージョンで 0.4.31 とかを使用してしまいます。 actix-webのissueプログラミングRustのissueでも上記のように修正してねという感じで言われています。

Rust は後方互換性に対してかなり厳格らしいので、バージョン変更で今回のようなことが起こることはあまりないと思いますが、良い経験になりました。

参考