重新导出可以关闭的可选货物功能

时间:2018-02-08 20:52:53

标签: rust rust-cargo

使用以下目录结构:

tree hello_dep
.
├── Cargo.lock
├── Cargo.toml
├── dep_a
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── dep_b
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── src
    └── main.rs

以下依赖链:hello_dep -> dep_a -> dep_b -> (optional feature) rustc-serialize, 我想在dep_a中创建一个功能,在dep_b中重新导出可选的rustc-serialize功能。

在底部,我有dep_b,它具有rustc-serialize作为可选的默认功能:

# dep_b/Cargo.toml
[package]
name = "dep_b"
version = "0.1.0"

[dependencies]
rustc-serialize = { version = "0.3.19", optional = true }

[features]
default = ["rustc-serialize"]

我想在dep_a中创建一个功能,以选择性地重新导出“rustc-serialize”。这是尝试:

# dep_a/Cargo.toml
[package]
name = "dep_a"
version = "0.1.0"

[dependencies]
dep_b = { version = "0.1.0", path = "../dep_b" }

[features]
rustc-serialize = ["dep_b/rustc-serialize"]
default = ["rustc-serialize"]

但是,当我尝试使用以下Cargo.toml将此作为依赖项添加到默认关闭时:

# hello_dep/Cargo.toml
[package]
name = "hello_dep"
version = "0.1.0"

[dependencies]
dep_a = { version = "0.1.0", path = "dep_a", default-features = false, optional = true }

cargo build仍会在Cargo.lock中产生rustc-serialize。但直接依赖于dep_b正确避免使用以下行拉入rustc-serialize

dep_b = { version = "0.1.0", path = "dep_b", default-features = false }

这是货物中的错误,还是我做错了什么?这是related question

1 个答案:

答案 0 :(得分:3)

dep_a/Cargo.toml中,您没有在default-features = false依赖项上指定dep_b。因此,默认情况下会启用rustc-serialize中的dep_b功能。您在dep_a中添加了一项功能以启用dep_b' rustc-serialize这一事实并未改变{{1}时仍然启用它的事实未启用功能。

因此,在dep_a中,您应该:

dep_a/Cargo.toml