我想制作一个带有 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"]
[[bin]]
中指定另一个目标。您能否详细说明您为使其正常工作所做的工作?我收到以下错误:use ::engine::RuleEngine;
could not find engine in {{root}}
如果您有一个大型项目,另一种格式可能是复制 Crates.io source code 所做的事情,例如:
src 中的主库,带有一个包含可执行文件的 Bin 文件夹。然后从您的可执行文件调用您的主库 crate。
这样,您的库是集中的,因此在缓存时更容易找到内容。
target/debug/$name
中,其中$name
是您在 Cargo.toml 中指定的name
。[[bin]]
使用required-features
,这将不起作用。为此,似乎cargo workspace
是唯一的解决方案?