我想创建一个带有守护进程和客户机的项目,通过unix套接字连接。

客户机和守护进程需要两个二进制文件,那么如何告诉Cargo从两个不同的源构建两个目标呢?

为了增加一点幻想,我希望有一个用于守护进程的主要部分的库,并有一个二进制文件来包裹它并通过套接字进行通信。

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

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

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


当前回答

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

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

其他回答

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

.
├── 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]]指定多个二进制文件,如下所述:

[[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。当Cargo自动将src/bin中的所有文件编译为同名的可执行文件时,您将得到两个名为daemon和client的可执行文件。只有在不遵循这种约定的情况下,才需要像上面的代码片段那样指定名称和路径。

另一种形式可能是复制板条箱。IO源代码已经完成,如果你有一个庞大的项目,像这样:

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

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