如何防止Cargo将相同的依赖项与不同的功能合并?

fgh*_*ghj 9 rust rust-crates rust-cargo

找出相同代码的货物构建后:虚假的编译时错误?,我想知道如何防止这样的问题:

$ 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
Run Code Online (Sandbox Code Playgroud)

我删除/添加依赖项而不进行任何代码修改,这会影响构建结果.

正如我所描述的那样,问题的根源是cexpr依赖于这样的nom:

nom = {version = "^3", features = ["verbose-errors"] }
Run Code Online (Sandbox Code Playgroud)

nmea描述了这样的依赖:

nom = "3.1.0"
Run Code Online (Sandbox Code Playgroud)

只有nmea作为依赖,Cargo使用一组功能构建nom,而Cargo使用另一组功能构建cexpr和nmea.

我想要一种方法来防止我维护的nmea箱子的错误使用.

我想像编译时错误一样"`nom` compiled with wrong features",或强迫Cargo构建两个nom变种.

我试过这样的事nmea/Cargo.toml:

nom = { version = "3.1.0", default-features = false }
Run Code Online (Sandbox Code Playgroud)

这没有改变; 当cexpr和nmea结合使用时,仍然存在编译时错误.

fgh*_*ghj 1

这是已知问题,相关链接:

货物问题1

货物问题2

货运RFC

简短摘要:

crate 的功能应该是可加的

换句话说,板条箱中的每个功能应该只附加功能,而不是更改 API。不幸的是,没有很好的文档来描述这个问题,并且至少目前还没有自动测试这个不变量的方法。nom这个特定问题与错误(github问题)相关,引用自那里:

这里的问题是,当使用“简单错误”时,类型nom::simple_errors::Err<E>只是 的类型别名nom::ErrorKind<E>,而使用“详细错误”时,类型nom::verbose_errors::Err<E>是专用枚举,因此“with-feature”和“without-feature”接口是不相容。