2017-07-24 34 views
9

搞清楚cargo build of the same code: spurious compile time errors?后,我想知道如何防止这样的问题:如何防止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 

我删除/添加的依赖,没有任何代码修改,这会影响构建结果。

的问题,as I described源,是cexpr取决于NOM这样的:

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

nmea描述这样的依赖关系:由于只有NMEA

nom = "3.1.0" 

作为依赖,货物使用一组功能创建标准, ,而Cargo则用另一组功能构建针对标称的cexpr和nmea。

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

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

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

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

这什么都没有改变;当cexpr和nmea结合时仍然存在编译时错误。

+0

这里可能值得有更多专业知识的人参与;也许你应该考虑将问题交叉发布到r/rust或者rust用户论坛,甚至在货物github仓库中打开一个bug。 –

+0

@MatthieuM。我发布了https:// github。com/rust-lang/charge/issues/4323 – fghj

回答

1

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

cargo issue 1

cargo issue 2

cargo rfc

的简短摘要:

箱的功能应该是添加剂

换句话说,箱子中的每个功能只应追加功能, 不会更改API。不幸的是,没有很好的文档描述这个问题,至少在这个时候没有自动测试这个不变量。 这个特殊的问题与nom的bug(github issue), 报价从那里:

这里的问题是,用“简单的错误”时,该类型nom::simple_errors::Err<E>简直是nom::ErrorKind<E>一个类型别名,同时用“详细错误”类型nom::verbose_errors::Err<E>是一个专用的枚举,所以“with-feature”和“without-feature”接口是不兼容的。

相关问题