为什么cargo要为rand包下载libc?

我正在学习锈。作为猜谜游戏教程的一部分,我下载了 rand crate。我担心依赖性混淆,并且不希望下载任何绝对必要的软件包。

因此,我将我的设置Cargo.toml为:

[dependencies]
rand = "=0.5.5"

但是,我注意到下载了 rand_core 的 3 个不同版本,以及 libc。

[dependencies]
rand = "=0.5.5"

我转到crates.io 上rand 0.5.5的依赖项页面,发现:

  1. 兰特 0.5.5 取决于
  2. rand_core ^0.2(我下载了 0.2.2)取决于
  3. rand_core ^0.3(我下载了 0.3.1)取决于
  4. rand_core ^0.4(我下载了 0.4.2)。

但是,任何地方都不需要依赖 libc。

为什么我要下载 libc?

回答

您可以使用cargo tree -i <CRATE>查看依赖于特定 crate 的内容:

$ cargo tree -i libc
libc v0.2.87
??? rand v0.5.5
    ??? guessing_game v0.1.0 (...)

所以是这样 rand。rand 0.5.5的依赖项页面确实说这rand_core是唯一需要的crate,但libc被列为optional。这意味着它被一个特征门控。

您可以查看 的输出cargo tree -i libc -e features以查看已启用的功能,但它并不完全直接,因为它显示了板条箱中启用的所有功能rand,而不仅仅是启用的功能libc

唯一确定的方法是查看板条箱的Cargo.toml

[features]
default = ["std"]
nightly = ["i128_support"]
std = ["rand_core/std", "alloc", "libc", "winapi", "cloudabi", "fuchsia-zircon"]
alloc = ["rand_core/alloc"]
i128_support = []
serde1 = ["serde", "serde_derive", "rand_core/serde1"]

[dependencies]
rand_core = { path = "rand_core", version = "0.2", default-features = false }
log = { version = "0.4", optional = true }
serde = { version = "1", optional = true }
serde_derive = { version = "1", optional = true }

[target.'cfg(unix)'.dependencies]
libc = { version = "0.2", optional = true }

所以libc既特征-和目标门控。它仅依赖于unix平台,并且仅在"std"启用该功能时使用,它是由"default". 您可以指定default-features = false选择退出它,但请注意,它最终会禁用大部分板条箱。


以上是为什么cargo要为rand包下载libc?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>