现在我有一个包含三个成员的货运工作区。
[workspace]
members = [
"foo",
"bar",
"baz",
]
如果我在根目录中运行cargo run
,则会收到此错误:
错误:清单路径
/home/lukas/dev/mahboi/Cargo.toml
是一个虚拟清单,但是此命令要求在此工作空间中的实际包上运行
这很有道理。我可以运行cargo run -p foo
,它可以工作。但问题是:foo
是唯一可执行的板条箱,我会经常执行它,所以如果我只运行cargo run
并执行它,那就太好了。
我尝试使用default-members
键,但这无济于事:
default-members = ["foo"]
是否还有另一种方式告诉货运cargo run
应该执行foo
条板箱(相当于在cargo run
子目录中运行foo/
)?我还将接受使根板条箱变为非虚拟的答案(即添加一个[package]
键)。
答案 0 :(得分:9)
此is available as of Rust 1.30。这是我测试过的完整文件集:
Cargo.toml
[workspace]
members = [
"foo",
"bar",
"baz",
]
foo / Cargo.toml
[package]
name = "foo"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]
[dependencies]
foo / src / main.rs
fn main() {
println!("Hello, world!");
}
bar / Cargo.toml
[package]
name = "bar"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]
[dependencies]
bar / src / lib.rs
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}
baz / Cargo.toml
[package]
name = "baz"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]
[dependencies]
baz / src / lib.rs
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}
$ tree .
.
├── Cargo.lock
├── Cargo.toml
├── bar
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
├── baz
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
├── foo
│ ├── Cargo.toml
│ └── src
│ └── main.rs
├── src
│ └── lib.rs
└── target
└── ...
$ cargo run
Compiling baz v0.1.0 (file:///private/tmp/example/baz)
Compiling bar v0.1.0 (file:///private/tmp/example/bar)
Compiling foo v0.1.0 (file:///private/tmp/example/foo)
Finished dev [unoptimized + debuginfo] target(s) in 0.39s
Running `target/debug/foo`
Hello, world!
您将需要使用Cargo不稳定的(从Rust 1.31版本开始)的“默认运行”功能来指定要使用的功能。
foo / Cargo.toml
cargo-features = ["default-run"]
[package]
name = "foo"
version = "0.0.1"
authors = ["An Devloper <an.devloper@example.com>"]
default-run = "foo"