1 个稳定版本
1.0.0 | 2021 年 9 月 19 日 |
---|
#8 in #cyclic
在 depcycle-x 中使用
4KB
这是什么?
此crate演示了Cargo中的crate级别循环依赖。
Cargo在特性级别而不是crate级别强制执行无环性[1],因此可以在crate级别创建循环依赖。
这是关于当你在一个集合B上定义一个偏序,并且从该集合到一个严格较小的集合S存在一个非注入满射映射F的一般定理的一个例子。
s0 <= s1 iff exists b0 <= b1 where F(b0) = s0 and F(b1) = s1
不是总是偏序,而是一个可能包含环的预序。
(这与投票系统中的各种不可能性结果有关。)
后果
应用于包管理器
- B是“crate特性集合”或“二进制包集合”
- B上的排序是特性级别或二进制级别的依赖排序
- S是“crate集合”或“源包集合”
- S上的排序是crate级别或源级别的依赖排序
Cargo不使用S上的排序,因此这些环对Rust生态系统没有实际负面影响。Cargo所做的是使用B上的排序来解决特性级别的依赖,然后将B中选择的元素转换为确定S中选择的元素 - 即需要下载以满足特性级别依赖的crate。
然而,将Cargo crate转换为其他包管理器的天真方法可能会导致其他包管理器使用S上的排序。这有以下实际负面影响
-
其他包管理器可能不支持S上的循环依赖
-
即使它在一般情况下支持S上的循环依赖,在特定情况下S可能包含相互冲突的crate。如果直接使用B上的排序,则不会出现这种情况,因为此级别的冲突会由Rust开发者自行管理;但S级别没有这种自我管理。