2017-07-24 32 views
9

Po zastanawianie się cargo build of the same code: spurious compile time errors?, chcę wiedzieć, jak uniknąć takiego problemu:W jaki sposób mogę zapobiec uzależnieniu Cargo od tej samej zależności z różnymi funkcjami?

$ cargo new feature_merge 
$ cargo add nmea 
$ cargo check > /dev/null 2>&1 && echo "success" 
success 
$ cargo add cexpr 
$ cargo check > /dev/null 2>&1 || echo "failed" 
failed 
$ cargo rm cexpr && cargo check > /dev/null 2>&1 && echo "success" 
success 

usunąć/dodać zależność bez modyfikacji kodu, a to wpływa na wynik kompilacji.

Źródłem problemu, as I described, że cexpr zależy nom tak:

nom = {version = "^3", features = ["verbose-errors"] } 

podczas nmea opisuje zależność takiego:

nom = "3.1.0" 

Z tylko NMEA jako zależność, Transport buduje nom z jednym zestawem funkcji, podczas gdy Cargo buduje cexpr i nmea przeciw nom z innym zestawem funkcji.

Potrzebuję sposobu, aby zapobiec takiemu niewłaściwemu użyciu skrzynki, którą utrzymuję.

Chciałbym błąd czasu kompilacji, taki jak "`nom` compiled with wrong features", lub zmusić Cargo do zbudowania dwóch wariantów nom.

Próbowałem coś takiego w nmea/Cargo.toml:

nom = { version = "3.1.0", default-features = false } 

To nic nie zmienił; nadal występuje błąd czasu kompilacji po połączeniu cexpr i nmea.

+0

Warto w tym przypadku zaangażować osoby o bardziej wyspecjalizowanej wiedzy; może powinieneś rozważyć przesłanie tego pytania do r/rust lub forum użytkowników rdzy, a nawet otwarcie błędu na repozytorium github cargo. –

+0

@ MatthieuM. Wysłałem https: // github.com/rust-lang/charge/issues/4323 jakiś czas temu – fghj

Odpowiedz

1

Jest to znany problem, powiązane linki:

cargo issue 1

cargo issue 2

cargo rfc

krótkie podsumowanie:

cechy paka są miało być dodatek

Innymi słowy, każda funkcja w skrzyni powinna tylko dołączać funkcjonalność, nie zmieniać API. Niestety nie ma dobrej dokumentacji opisującej ten problem, nie ma automatyzacji testowania tego niezmiennika przynajmniej w tej chwili. Ten szczególny problem jest związany nom bug (github issue), cytując stamtąd:

Problemem jest to, że w przypadku korzystania z „prostych błędów”, typ nom::simple_errors::Err<E> jest po prostu rodzajem alias nom::ErrorKind<E>, natomiast z "szczegółowe błędy" typ nom::verbose_errors::Err<E> jest dedykowanym wyliczeniem, więc interfejsy "z funkcją" i "bez funkcji" są niekompatybilne.