Rust & Amethyst - 错误 [E0433]:解析失败:无法在 `quote` 中找到 `__rt`
Rust & Amethyst - Error [E0433]: failed to resolve: could not find `__rt` in `quote`
我正在向 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...
TL;DR 手动编辑 Cargo.lock
,请查看下面的标题:How to force cargo to use yanked version of sub-dependency(正确的步骤)
为什么会这样?
发生这种情况是因为在 err-derive-0.1.6
中使用 quote-1.0.2
作为依赖项,但在 cargo.toml
中声明的依赖项是这样的:
[dependencies.quote]
version = "1.0.2"
这意味着 cargo 将使用最新的次要更新,因此如果 quote-1.0.3
出来那么 cargo 将使用 1.0.3
而不是 1.0.2
。请检查 caret-requirement。这里的问题是 quote-1.0.3
破坏了来自 quote-1.0.2
的向后兼容性。在这种情况下引用
如何强制 cargo 使用特定版本的 sub-dependency
您可以通过强制 sub-dependency 为您的依赖项使用兼容版本来解决此问题。
此命令将执行此操作:
> cargo update -p quote --precise 1.0.2
如何强制 cargo 使用 yanked 版本的 sub-dependency
看起来 quote-1.0.2
是从 crates.io 中抽出的,所以上面的命令将不起作用,因为 cargo 将无法在 crates.io 上找到抽出的版本。由于 cargo update 修改了 cargo.lock
我们可以手动完成。开始清洁:
- 删除
Cargo.lock
- 运行
cargo update
(这将生成最新版本 Cargo.lock
)
- 编辑
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,它会覆盖你的更改,你将无法编译你的项目。请记住,这是一种能够继续开发的解决方法,有理由抽出包装箱,不要在生产中使用它,最好等待依赖的包装箱自行更新。
注意:在某些情况下,您可能会在编辑后出现错误cargo.lock
:
error: Found argument 'Cargo.lock' which wasn't expected, or isn't valid in this context
@albus_c 由 doing 修复了此问题:
A note for posterity: I fixed the issue removing rustc
(sudo apt remove rustc
) and reinstalled as recommended on the Rust website,
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
After that everything worked fine.
我正在向 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...
TL;DR 手动编辑 Cargo.lock
,请查看下面的标题:How to force cargo to use yanked version of sub-dependency(正确的步骤)
为什么会这样?
发生这种情况是因为在 err-derive-0.1.6
中使用 quote-1.0.2
作为依赖项,但在 cargo.toml
中声明的依赖项是这样的:
[dependencies.quote]
version = "1.0.2"
这意味着 cargo 将使用最新的次要更新,因此如果 quote-1.0.3
出来那么 cargo 将使用 1.0.3
而不是 1.0.2
。请检查 caret-requirement。这里的问题是 quote-1.0.3
破坏了来自 quote-1.0.2
的向后兼容性。在这种情况下引用
如何强制 cargo 使用特定版本的 sub-dependency
您可以通过强制 sub-dependency 为您的依赖项使用兼容版本来解决此问题。 此命令将执行此操作:
> cargo update -p quote --precise 1.0.2
如何强制 cargo 使用 yanked 版本的 sub-dependency
看起来 quote-1.0.2
是从 crates.io 中抽出的,所以上面的命令将不起作用,因为 cargo 将无法在 crates.io 上找到抽出的版本。由于 cargo update 修改了 cargo.lock
我们可以手动完成。开始清洁:
- 删除
Cargo.lock
- 运行
cargo update
(这将生成最新版本Cargo.lock
) - 编辑
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,它会覆盖你的更改,你将无法编译你的项目。请记住,这是一种能够继续开发的解决方法,有理由抽出包装箱,不要在生产中使用它,最好等待依赖的包装箱自行更新。
注意:在某些情况下,您可能会在编辑后出现错误cargo.lock
:
error: Found argument 'Cargo.lock' which wasn't expected, or isn't valid in this context
@albus_c 由 doing 修复了此问题:
A note for posterity: I fixed the issue removing rustc (
sudo apt remove rustc
) and reinstalled as recommended on the Rust website,curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
After that everything worked fine.