Help us understand the problem. What is going on with this article?

Rustのfailure_deriveコンパイルエラー(解決しました)

2020/3/6 2:00 追記

先ほどfailureのv0.1.7がリリースされたことで問題は解決しました。
現在は以下の対策は不要になっています。

はじめに

2020/3/5現在、Rustの多くのクレートが以下のようなコンパイルエラーになる可能性があります。
結構影響範囲が広そうなので原因と対策をまとめておきます。

error[E0433]: failed to resolve: could not find `__rt` in `quote`
   --> /Users/sloveless/.cargo/registry/src/github.com-1ecc6299db9ec823/failure_derive-0.1.6/src/lib.rs:107:70
    |
107 | fn display_body(s: &synstructure::Structure) -> Result<Option<quote::__rt::TokenStream>, Error> {
    |                                                                      ^^^^ could not find `__rt` in `quote`

対策

自分のクレートがコンパイルエラーになる場合はCargo.tomlに以下を追加してください。
("1.0.2"の前についている=が重要です)

Cargo.toml
[dependencies]
quote = "=1.0.2" # workaround of https://github.com/rust-lang-nursery/failure/issues/342

cargo installコマンドが失敗する場合には、代わりにcargo install --lockedを使ってください。

原因

2020/3/5 9:00頃にquoteクレートのバージョン1.0.3がリリースされました。1.0.2からのパッチバージョンアップデートなので、アップデートしても互換性に問題ないはずだったのですが、failure_deriveが壊れる結果となりました。
これはfailure_deriveがquoteの非公開APIを使っていたためのようです。(詳細は未確認です)

failure_deriveはfailureを通してcrates.io内の多数のクレートで使われており、手元の計測では全クレートの6割に達します。
そのためかなり高い確率でこの問題の影響を受けることになると思われます。

すでにCargo.lockを作成済みの環境ではcargo updateしない限り影響はありません。

dalance
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away