如何在货物工作区的根目录中指定默认运行的"货运"?

Luk*_*odt 8 rust rust-cargo

现在我有一个有三个成员的Cargo工作区.

[workspace]
members = [
    "foo",
    "bar",
    "baz",
]
Run Code Online (Sandbox Code Playgroud)

如果我cargo run在根目录中运行,我收到此错误:

错误:清单路径/home/lukas/dev/mahboi/Cargo.toml是虚拟清单,但此命令需要针对此工作空间中的实际包运行

那讲得通.我可以跑cargo run -p foo,它的工作原理.但问题是:foo是唯一可执行的包,我会经常执行它,所以如果我可以运行cargo run并执行它会很好.

我试图使用default-members密钥,但这没有帮助:

default-members = ["foo"]
Run Code Online (Sandbox Code Playgroud)

是否有另一种方法告诉Cargo cargo run应该执行foocrate(相当于cargo runfoo/子目录中运行)?我也会接受使根箱不是虚拟的答案(即添加[package]密钥).

She*_*ter 10

单二进制

可以从Rust 1.30开始提供.这是我测试过的完整文件集:

Cargo.toml

[workspace]
members = [
    "foo",
    "bar",
    "baz",
]
Run Code Online (Sandbox Code Playgroud)

富/ Cargo.toml

[package]
name = "foo"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]

[dependencies]
Run Code Online (Sandbox Code Playgroud)

富/ SRC/main.rs

fn main() {
    println!("Hello, world!");
}
Run Code Online (Sandbox Code Playgroud)

酒吧/ Cargo.toml

[package]
name = "bar"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]

[dependencies]
Run Code Online (Sandbox Code Playgroud)

酒吧/ SRC/lib.rs

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}
Run Code Online (Sandbox Code Playgroud)

巴兹/ Cargo.toml

[package]
name = "baz"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]

[dependencies]
Run Code Online (Sandbox Code Playgroud)

巴兹/ SRC/lib.rs

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}
Run Code Online (Sandbox Code Playgroud)
$ 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
    ??? ...
Run Code Online (Sandbox Code Playgroud)
$ 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!
Run Code Online (Sandbox Code Playgroud)

多个二进制文件

您将需要使用Cargo的不稳定(从Rust 1.31开始)"默认运行"功能来指定使用哪一个.

富/ Cargo.toml

[package]
name = "foo"
version = "0.0.1"
authors = ["An Devloper <an.devloper@example.com>"]
default-run = "foo"
Run Code Online (Sandbox Code Playgroud)

  • 为了帮助像我这样有点困惑的人。将默认运行添加到要作为默认值的二进制文件的Cargo.toml确实可以工作,即使内部Cargo.toml的默认运行不应影响调用`cargo run`时发生的情况也可能令人惊讶。在工作区的根目录。 (2认同)
  • @justin.m.chase 这不是 Cargo 本身支持的东西。您可以做的一件事是创建第三个二进制文件,它使用 [`std::process::Command`](https://doc.rust-lang.org/std/process/struct.Command.html) 来生成服务器和客户。 (2认同)