У меня есть ящик A
, который зависит от B
и B
зависит от ящика rust-nmea.
Если я построю ящик A
, у меня будет куча ошибок (все они пропустили use std::error::Error;
) во время сборки rust-nmea зависимость:
error[E0599]: no method named `description` found for type `nom::Err<&[u8]>` in the current scope
--> /home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/src/parse.rs:100:44
|
100 | IError::Error(e) => e.description().to_string(),
| ^^^^^^^^^^^
|
= help: items from traits can only be used if the trait is in scope
= note: the following trait is implemented but not in scope, perhaps add a `use` for it:
candidate #1: `use std::error::Error;`
Но если я перейду к дереву исходных текстов B
crate и запускаю cargo build
, все будет построено без каких-либо ошибок (если вы последуете за мной, A
зависят от B
, а B
зависят от rust-nmea),
также, если перейти к /home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/
(см. ошибку компиляции) и запустить cargo build
, тогда все будет хорошо.
Выставка грузовых деревьев для A
:
│ ├── chrono v0.4.0
│ │ ├── num v0.1.40
│ │ │ ├── num-integer v0.1.35
│ │ │ │ └── num-traits v0.1.40
│ │ │ ├── num-iter v0.1.34
│ │ │ │ ├── num-integer v0.1.35 (*)
│ │ │ │ └── num-traits v0.1.40 (*)
│ │ │ └── num-traits v0.1.40 (*)
│ │ └── time v0.1.38
│ │ └── libc v0.2.27
├── nmea v0.0.6
│ ├── chrono v0.4.0 (*)
│ └── nom v3.2.0
│ └── memchr v1.0.1 (*)
и для кешированных cargo
rust-nmea:
├── chrono v0.4.0
│ ├── num v0.1.40
│ │ ├── num-integer v0.1.35
│ │ │ └── num-traits v0.1.40
│ │ ├── num-iter v0.1.34
│ │ │ ├── num-integer v0.1.35 (*)
│ │ │ └── num-traits v0.1.40 (*)
│ │ └── num-traits v0.1.40 (*)
│ └── time v0.1.38
│ └── libc v0.2.27
└── nom v3.2.0
└── memchr v1.0.1
└── libc v0.2.27 (*)
поэтому как для хорошего, так и для плохого случая используются одни и те же зависимости.
Если запустить cargo build -v -j1
, я получу rustc
командную строку для обоих случаев.
Единственная разница для хорошего и плохого случая заключается в следующем:
-L dependency=/home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/target/debug/deps --extern chrono=/home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/target/debug/deps/libchrono-8e9e54e691d9b988.rlib --extern nom=/home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/target/debug/deps/libnom-b72336f662b090c1.rlib
в плохом случае путь к библиотекам отличается и libnom-e2ec53418967eac0.rlib
вместо libnom-b72336f662b090c1.rlib
, а libchrono-8e9e54e691d9b988.rlib
совпадает.
Ящики A
и B
поставляются из близких источников, и я не могу свести проблему к более простому случаю. Ящики nom не используются в A
и B
, кроме как через rust-nmea. rust-nmea используется просто, просто nmea = 0.0.6
в Cargo.toml
. Никаких флагов или чего-то подобного.
Любая идея, почему зависимость ящика с одними и теми же флагами (без флагов вообще) может вызывать или не вызывать синтаксическую ошибку?
rustup
, но последняя команда отмены была:grep -a override ~/.bash_history | grep rustup | tail -n 1
rustup override unset
. Есть ли способ проверить, активен лиoverride
? - person fghj   schedule 24.07.2017rustup override list
. - person DK.   schedule 24.07.2017cargo clean
, а затемcargo update
перед повторным запускомcargo build
? Хотя с учетом выводаcargo tree
это было бы немного удивительно, но это могло быть случаем устаревшей зависимости. - person J David Smith   schedule 24.07.2017Cargo.lock
иtarget
), а также проверяю версиюnom
черезCargo.lock
на случай ошибкиcargo tree
- person fghj   schedule 24.07.2017