如何使用 Cargo 构建多个二进制文件?

How can I build multiple binaries with Cargo?

我想用 daemonclient 创建一个项目,通过 unix 套接字连接。

一个 client 和一个 daemon 需要两个二进制文件,那么我如何告诉 Cargo 从两个不同的来源构建两个目标?

为了增加一点幻想,我想要一个 library 作为 daemon 的主要部分,并且只需要一个二进制文件来环绕它并通过套接字进行通信。

所以,我们有这种树结构:

├── Cargo.toml
├── target
|   └── debug
|       ├── daemon
│       └── client
└── src
    ├── daemon
    │   ├── bin
    │   │   └── main.rs
    │   └── lib
    │       └── lib.rs
    └── client
        └── bin
            └── main.rs

我可以制作一个可执行文件来管理这两个问题,但这不是我想要做的,除非这是很好的做法。

您可以使用 [[bin]] 指定多个二进制文件,如前所述 here:

[[bin]]
name = "daemon"
path = "src/daemon/bin/main.rs"

[[bin]]
name = "client"
path = "src/client/bin/main.rs"

提示:如果您将这些文件放在 src/bin/daemon.rssrc/bin/client.rs 中,您将得到两个名为 daemonclient 的可执行文件,因为 Cargo 会编译所有文件src/bin 自动转换为同名的可执行文件。仅当您不遵循此约定时,才需要像上面的代码片段一样指定名称和路径。

另一种方法是使用the workspace feature。由于我们可以拥有多个库这一事实,这将提供更大的灵活性。示例项目结构:

.
├── Cargo.toml
├── cli
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── core
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── daemon
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── gui
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── rpc
    ├── Cargo.toml
    └── src
        └── lib.rs

根目录 Cargo.toml 的内容:

[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]

另一种格式可以是复制 Crates.io source code 所做的事情,如果您有一个大型项目,例如:

src 中的主库,带有包含可执行文件的 Bin 文件夹。 然后从你的可执行文件调用你的主库 crate。

这样你的图书馆就集中起来了,因为它被缓存了,所以更容易找到东西。