Rust & Amethyst - ошибка [E0433]: не удалось разрешить: не удалось найти `__rt` в` quote` - PullRequest
3 голосов
/ 07 марта 2020

Я изучаю 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...

1 Ответ

5 голосов
/ 07 марта 2020

TL; DR Отредактируйте Cargo.lock вручную, пожалуйста, проверьте заголовок ниже: Как заставить машину go использовать дернутую версию суб-зависимости (для правильной шаги)


Почему это происходит?

Это произошло потому, что в err-derive-0.1.6 используется quote-1.0.2 в качестве зависимости, но в cargo.toml зависимости объявлено так:

[dependencies.quote]
version = "1.0.2"

Это означает, что машина go будет использовать последнее незначительное обновление, поэтому, если quote-1.0.3 выйдет, то машина go будет использовать 1.0.3 вместо 1.0.2. Пожалуйста, проверьте Требование к каретке . Проблема в том, что quote-1.0.3 нарушает обратную совместимость с quote-1.0.2. В этом случае цитата

Как заставить машину go использовать указанную c версию суб-зависимости

Эту проблему можно исправить, если заставить суб-зависимость использовать совместимую версию для ваша зависимость. Эта команда сделает это:

> cargo update -p quote --precise 1.0.2 

Как заставить машину go использовать выдернутую версию зависимостей

Похоже, quote-1.0.2 выдернули из crates.io, поэтому команда выше не будет работать, потому что машина go не сможет найти янкированную версию на crates.io. Так как обновление машины go изменяет cargo.lock, мы можем сделать это вручную. Чтобы начать очистку:

  1. Удалить Cargo.lock
  2. Запустить cargo update (будет сгенерирована последняя версия Cargo.lock)
  3. Редактировать Cargo.lock

Найдите несовместимую версию пакета в автомобиле go .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"

После этого не запускайте обновление машины go снова, оно заменит ваши изменения, и вы не сможете скомпилировать ваш проект. Пожалуйста, помните, что это обходной путь для возможности продолжения разработки, есть причина дергать ящики, не используйте его в производстве, лучше подождать, пока зависимые ящики обновятся.


Примечание: В некоторых случаях вы можете получить ошибку после редактирования cargo.lock:

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

@ albus_ c исправлено это делает :

Примечание для потомков: я исправил проблему с удалением ржавчины c (sudo apt remove rustc) и переустановил, как рекомендовано на веб-сайте Rust, curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh После этого все заработало отлично.

...