在搞清楚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 described是cexpr依赖于这样的名词:
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合并时,仍然存在编译时错误。
答案 0 :(得分:1)
已知问题,相关链接:
简短摘要:
crate的功能应该是附加的
换句话说,包中的每个功能都只应附加功能,
不要改变API。不幸的是没有好的文档来解决这个问题,
并且至少在此刻没有自动测试这个不变量。
此特定问题与nom
错误(github issue)有关,
从那里引用:
这里的问题是,当使用“简单错误”时,类型
nom::simple_errors::Err<E>
只是nom::ErrorKind<E>
的类型别名,而“详细错误”类型nom::verbose_errors::Err<E>
是专用枚举,因此“with-feature”和“without-feature”接口是不兼容的。