如何使用 Cargo 构建多个二进制文件?
How can I build multiple binaries with Cargo?
我想用 daemon
和 client
创建一个项目,通过 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.rs
和 src/bin/client.rs
中,您将得到两个名为 daemon
和 client
的可执行文件,因为 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。
这样你的图书馆就集中起来了,因为它被缓存了,所以更容易找到东西。
我想用 daemon
和 client
创建一个项目,通过 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.rs
和 src/bin/client.rs
中,您将得到两个名为 daemon
和 client
的可执行文件,因为 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。
这样你的图书馆就集中起来了,因为它被缓存了,所以更容易找到东西。