关于rust:如何使用Cargo构建多个二进制文件?

How can I build multiple binaries with Cargo?

我想制作一个daemonclient的项目,并通过unix套接字进行连接。

clientdaemon需要两个二进制文件,那么如何告诉Cargo从两个不同的源构建两个目标?

为了增加一点幻想,我想对daemon的主要部分使用library,并且只用二进制文件包装它并通过套接字进行通信。

因此,我们有这种树结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
├── Cargo.toml
├── target
|   └── debug
|       ├── daemon
│       └── client
└── src
    ├── daemon
    │   ├── bin
    │   │   └── main.rs
    │   └── lib
    │       └── lib.rs
    └── client
        └── bin
            └── main.rs

我可以使一个可执行文件同时解决这两个问题,但这不是我想做的,除非这是一种很好的做法。


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

1
2
3
4
5
6
7
[[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中的所有文件编译为同名可执行文件。仅当您不遵循此约定时,才需要像上面的代码片段中那样指定名称和路径。


另一种方法是使用此处提到的工作区功能。由于我们可以拥有多个库,因此这将提供更大的灵活性。项目结构示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.
├── 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的内容:

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


如果您有一个庞大的项目,另一种格式可能是复制Crates.io源代码的工作,例如:

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

这样,您的库就可以集中化,以便在缓存时更容易查找内容。