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

时间:2017-07-24 18:00:46

标签: rust rust-cargo rust-crates

在搞清楚cargo build of the same code: spurious compile time errors?之后,我想知道如何防止出现这样的问题:

$ 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

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

问题的来源as I describedcexpr依赖于这样的名词:

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

虽然nmea描述了这样的依赖:

nom = "3.1.0"

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

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

我想要像"`nom` compiled with wrong features"这样的编译时错误,或强制Cargo构建两个nom的变体。

我在nmea/Cargo.toml尝试了这样的事情:

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

这没有改变;当cexpr和nmea合并时,仍然存在编译时错误。

1 个答案:

答案 0 :(得分:1)

已知问题,相关链接:

cargo issue 1

cargo issue 2

cargo rfc

简短摘要:

  

crate的功能应该是附加的

换句话说,包中的每个功能都只应附加功能, 不要改变API。不幸的是没有好的文档来解决这个问题, 并且至少在此刻没有自动测试这个不变量。 此特定问题与nom错误(github issue)有关, 从那里引用:

  

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