3

我正在从Shing Lyu的“Practical Rust Projects”中学习 Rust。我现在正在尝试按照第 4 章中的步骤构建游戏。我正在使用 Ubuntu 18.04 LTS。

安装 Rust 和 Amethyst 命令行后,我通过amethyst new cat_volleyball. 下一步是使用cargo run --features=vulkan . 当我这样做时,我收到下面的错误提示。你对如何解决这个问题有什么建议吗?

error[E0433]: failed to resolve: could not find `__rt` in `quote`
   --> /home/alberto/.cargo/registry/src/github.com-1ecc6299db9ec823/err-derive-0.1.6/src/lib.rs:145:63
    |
145 | fn display_body(s: &synstructure::Structure) -> Option<quote::__rt::TokenStream> {
    |                                                               ^^^^ could not find `__rt` in `quote`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0433`.
error: could not compile `err-derive`.
warning: build failed, waiting for other jobs to finish...
4

1 回答 1

5

TL;DR手动编辑Cargo.lock,请检查下面的标题:如何强制货物使用 yanked 版本的子依赖项(正确的步骤)


为什么会这样?

err-derive-0.1.6发生这种情况是因为 inquote-1.0.2用作依赖项,但它的cargo.toml依赖项声明如下:

[dependencies.quote]
version = "1.0.2"

这意味着 cargo 将使用最新的次要更新,因此如果quote-1.0.3已发布,则 cargo 将1.0.3改为使用1.0.2。请检查插入符要求。这里的问题是quote-1.0.3破坏了来自quote-1.0.2. 在这种情况下报价

如何强制 cargo 使用特定版本的子依赖

您可以通过强制子依赖项为您的依赖项使用兼容版本来解决此问题。该命令将执行此操作:

> cargo update -p quote --precise 1.0.2 

如何强制 cargo 使用 yanked 版本的子依赖

看起来像是quote-1.0.2从 crates.io 拉出的,所以上面的命令将不起作用,因为 cargo 将无法在 crates.io 上找到被拉出的版本。由于货物更新修改了cargo.lock我们可以手动进行。开始清洁:

  1. 消除Cargo.lock
  2. 运行cargo update(这将生成最新版本Cargo.lock
  3. 编辑Cargo.lock

在 cargo.lock 中找到不兼容的包版本quote-1.0.3,它应该是这样的:

[[package]]
name = "quote"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
]

然后在我们的例子中只需将版本更改为兼容版本"1.0.2"

[[package]]
name = "quote"
version = "1.0.2"

之后不要再次运行 cargo update ,它将覆盖您的更改并且您将无法编译您的项目。请记住,这是一种能够继续开发的解决方法,有理由 yank crates,不要在生产中使用它,最好等待相关 crates 自行更新。


注意: 在某些情况下,您可能会在编辑后收到错误cargo.lock

error: Found argument 'Cargo.lock' which wasn't expected, or isn't valid in this context

@albus_c 解决了这个问题

后人注意:我修复了删除 rustc ( sudo apt remove rustc) 的问题,并按照 Rust 网站上的建议重新安装, curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 之后一切正常。

于 2020-03-07T10:01:51.257 回答