#order #cyclic #partial #mapping #crate-level #non-injective #surjective

depcycle-y

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

1 个稳定版本

1.0.0 2021 年 9 月 19 日

#8 in #cyclic


depcycle-x 中使用

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

不是总是偏序,而是一个可能包含环的预序。

(这与投票系统中的各种不可能性结果有关。)

后果

应用于包管理器

  • 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级别没有这种自我管理。

依赖