导入依赖项的版本,该依赖项是其他依赖项所要求的。

3

我有两个箱子XZ,我想同时使用它们,但是X依赖于某个特定版本的Z。例如,mongodb依赖于tokio 0.2,而我正在使用tokio 0.3。

X没有重新导出Z,因此我(认为)必须在Cargo.toml中手动指定Z。如果我指定了错误的版本,可能会出现错误。如何告诉Cargo使用X所需的任何版本的Z


如果X需要您使用正确的版本的Z才能正确地进行交互操作,则它需要为您提供实现此操作的手段,这可能意味着它应该简单地重新导出它正在使用的Z版本,但也可能意味着它提供了一个封装了它正在使用的Z位的接口。如果X没有这样做,我认为这是一个错误。 - Sven Marnach
1个回答

2
货物具有一些自动依赖版本解析功能。您应该能够指定您所需的Z版本要求,而Cargo将找出如何选择正确的版本以(可能)在您的代码和X中使用。
这是假设两个箱正确使用语义化版本控制。
如果X没有以任何方式公开Z,则您不需要真正使用相同版本的Z。如果您使用与X不同的主要版本Z,则Cargo将仅为您和X使用两个版本的Z
请参见alexcrichton对此的评论以获取更多详细信息。

1
使用 Z = "*" 将告诉 Cargo 选择 Z 的版本本身。如果 X 是您的依赖树中唯一依赖于 Z 的其他板条箱,那么这确实会导致 Cargo 选择与 X 依赖的相同版本的 Z。但是,如果有其他板条箱依赖于其他版本的 Z,则您将失去该保证,因此这并不是一个真正的解决方案。 - Sven Marnach
@SvenMarnach 是的,因为没有真正的方法可以100%保证您使用与“X”相同且没有其他版本,最好让Cargo处理它。 它应该能够使其工作,除非板条箱不遵循语义化版本控制。 - Emoun
这根本不是真的。即使你依赖树中的所有板条箱都正确使用语义化版本控制,Cargo 仍然无法知道你实际上想要由依赖项 X 使用的 Z 版本,而不是由依赖项 Y 使用的 X 版本,因为没有办法告诉 Cargo 这就是你想要的。 - Sven Marnach
1
我想说的是,如果版本 X 没有公开使用,你不应该纠结于它使用的是哪个版本。只需在代码中使用您需要的任何版本 Z 并且 Cargo 将为 X 提供它所需的 Z 版本。如果恰好存在一个您都可以使用的版本,那太好了,您和 X 都将得到它。否则,没问题,创建两次,一次为您,一次为 X - Emoun
1
但是这个 crate 不仅会被编译两次,它的所有运行时资源也会被复制两次,对吗?例如,如果 Z 创建了一个线程池或记录器,你最终会得到两个不同的线程池或记录器或其他东西。如果 Z 被正确编写,事情仍然可以正常工作,但并不意味着没有运行时成本需要支付,也不意味着成本完全看不见。我错了吗? - user4815162342
是的,我认为是这样。此时,编译器将每个版本的 crate 视为不同的实体,因此它们可能完全是不同的 crate。例如,假设您有一个类型 Z::SomeType,编译器不会将第一个版本中的该类型视为与第二个版本中的相同类型。 - Emoun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接