9

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

$ 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

我在不修改任何代码的情况下删除/添加了依赖项,这会影响构建结果。

正如我所描述的,问题的根源是cexpr依赖于 nom ,如下所示:

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

nmea像这样描述依赖关系:

nom = "3.1.0"

只有 nmea 作为依赖项,Cargo 使用一组特征构建 nom,而 Cargo 使用另一组特征针对 nom 构建 cexpr 和 nmea。

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

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

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

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

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

4

1 回答 1

1

已知问题,相关链接:

货物问题 1

货物问题 2

货物 rfc

简短的总结:

crate 的特征应该是附加的

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

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

于 2017-07-25T19:10:33.907 回答