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


104

我想用adaemon和a创建一个项目,并client通过unix套接字进行连接。

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

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

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

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

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



作为Dognert的回答的补充,他们回答了我收到的所有问题。十分感谢!
RallionRl

Answers:


137

您可以指定使用多个二进制文件[[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.rs,则会得到两个名为的可执行文件daemonclient因为Cargo会将所有文件src/bin自动编译为具有相同名称的可执行文件。仅当您不遵循此约定时,才需要像上面的代码片段中那样指定名称和路径。


我查看了Cargo文档,但是什么也看不到,可以指定输出以存储二进制文件?例如pathTo:“ / some / path”对不起,我的英语。
Angel

如果您认为最好提出一个问题,那么我可以毫无问题地解决,找到具有相同问题的其他人可能会更容易?
Angel

您想自定义@AngelAngel的输出路径吗?默认情况下,它会被存储在target/debug/$name哪里$namename你Cargo.toml指定。
Dogbert '16

我只是想知道您是否可以说在默认位置以外的其他位置安装二进制副本。$ name中的一个副本,另一个路径中的另一个副本。并不是说它是琐碎的,只是出于好奇,感谢您的宝贵时间。
Angel Angel

@AngelAngel我认为您正在寻找cargo install命令。尝试读取的输出cargo help install
Dogbert '16

18

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

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

1
我无法使它正常工作。我必须将src /文件夹中的二进制锈源移到,并在中指定另一个目标[[bin]]。您能否提供更多有关如何使它正常工作的详细信息?我收到以下错误: use ::engine::RuleEngine; could not find engine in {{root}}
肯尼·班布里奇

@KennyBambridge我已经有一段时间没有在Rust上工作了。当我创建此答案时,IIRC在本地计算机上尝试过,并且可以正常运行。
UltimaWeapon

@KennyBambridge您必须在其他工作区中将板条箱添加为要在其中使用它们的Cargo.toml中的依赖项。
凯撒

1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.