#cyclic #md #details #order #set #demonstrate #crate-level

depcycle-x

crate级别循环依赖的示例;详情请见README.md

3个版本 (稳定)

1.0.1 2021年9月19日
0.1.0 2021年9月19日

#418 in 操作系统

每月下载 24次
depcycle-y中使用

MIT/Apache

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的级别上没有这样的自我约束。

依赖