3个版本 (稳定)
1.0.1 | 2021年9月19日 |
---|---|
0.1.0 | 2021年9月19日 |
#418 in 操作系统
每月下载 24次
在depcycle-y中使用
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
在这种情况下,S上的排序不是偏序,但是一个可能包含循环的预序。
(这与选举系统中的各种不可行结果有关。)
后果
应用于包管理器
- 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的级别上没有这样的自我约束。