【发布时间】:2020-08-15 18:41:28
【问题描述】:
由于这个问题涉及到多个依赖关系,我不确定从哪个方向寻找重现它,我希望可以根据具体示例询问它。这个问题背后更普遍的模式是:有一个依赖链user => libExtension => libBase和libExtension和libBase不兼容。
在geo-booleanop 项目中,我们遇到了一个我们无法完全理解的有趣issue。它涉及以下软件包的相互作用:
-
geo-types (
libBase):核心库,提供直线、矩形、多边形等基本类型。 -
geo-booleanop (
libExtension):一个建立在地理类型之上的库,用一个新功能扩展它:一个新的特征BooleanOp,它具有交叉/联合/...等功能并针对地理类型中的多边形类型实现。 - 任何将 geo-types 和 geo-booleanop 组合在一起的用户包,目的是为多边形使用
BooleanOptrait。
包地理类型最近从 0.4 版到 0.5 版发生了重大变化,例如,它将其 Rect 类型的一些字段从 pub 字段更改为 getter。
geo-booleanop 包尚未用于此更改,即,它仍显式使用这些 pub 字段。目前,geo-booleanop 的 Cargo.toml 指定了 geo-types = "0.4",并且尝试将其提高到 0.5 并在 geo-booleanop 中执行 cargo build 会导致在 pub 字段访问时出现编译器错误。
现在令人惊讶的是:在创建结合最新版本地理类型和地理布尔运算的用户包时,我们在用户包中看到来自 cargo build 的以下输出:
$ cargo build
[...]
Compiling geo-booleanop v0.2.1
Compiling geo-types v0.5.0
[...]
error[E0599]: no method named `union` found for type `geo_types::polygon::Polygon<{float}>` in the current scope
--> src/main.rs:21:23
|
21 | let union = poly1.union(&poly2);
| ^^^^^ method not found in `geo_types::polygon::Polygon<{float}>`
这很令人惊讶,因为:
- 根本不可能同时编译 geo-booleanop v0.2.1 和 geo-types v0.5.0,因为它们不兼容。
- 关于没有名为
union的方法的错误令人困惑,因为用户代码做了所有正确的事情来将BooleanOp特征带入范围,这应该为多边形提供完全正确的方法。 - 具有讽刺意味的是,编译器还会输出一个警告,指出
BooleanOp特征导入未使用。
我的问题是:
- 为什么
cargo build没有显示突出显示依赖项不兼容的编译错误? - 如果这是有意为之,我们可以在 geo-booleanop 网站上做些什么来让我们的用户更容易掌握这些问题吗?目前,他们在编写代码方面做的一切都是正确的,以将特征带入范围,但编译器的行为就像特征缺失一样——而实际上它是版本不匹配。我们可以在图书馆网站上强制执行更明确的错误吗?
详细信息以防万一:
-
BooleanOp特征在其底层浮点类型 (see implementation) 中是通用的。这是否会导致问题,因为在客户端代码像在其他编程语言中一样使用泛型之前,不会实例化泛型? - 这是复制客户端代码:main.rs 和 Cargo.toml。
【问题讨论】:
标签: rust dependencies traits rust-cargo