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

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

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

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

所以,我们有这样的树形结构:

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

我可以让一个可执行文件同时管理两个关注点,但这不是我想做的,除非这是很好的实践。

69076 次浏览

可以使用[[bin]]指定多个二进制文件,如前面提到的在这里:

[[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中的所有文件编译成同名的可执行文件。只有在不遵循这种约定的情况下,才需要像上面的代码片段那样指定名称和路径。

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

.
├── 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"]

另一种格式可以是复制板条箱。IO源代码所做的工作,如果你有一个大型项目,比如:

主库在src,与Bin文件夹与您的可执行文件。 然后从你的可执行文件中调用你的主库crate

这样你的库是集中的,所以更容易找到东西,因为它是缓存的。