Подтвердить что ты не робот

Как я могу создать несколько двоичных файлов с Cargo?

Я хотел бы создать проект с daemon и client, подключившись через unix-сокет.

A client и a daemon требуют двух двоичных файлов, так как я могу сказать Cargo построить две цели из двух разных источников?

Чтобы добавить немного фантазии, я хотел бы иметь library для основной части daemon и просто иметь двоичный файл, чтобы обернуть его и обмениваться данными через сокеты.

Итак, у нас есть такая архитектура дерева:

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

Я мог бы сделать один исполняемый файл, который управляет обеими проблемами, но это не то, что я хочу сделать, если это не очень хорошая практика.

4b9b3361

Ответ 1

Вы можете указать несколько двоичных файлов, используя [[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, вы получите два исполняемых файла с именем daemon и client, так как Cargo скомпилирует все файлы в src/bin в исполняемые файлы с тем же именем автоматически, Вам нужно указать имена и пути, как в приведенном выше фрагменте, только если вы не следуете этому соглашению.

Ответ 2

Другой способ - использовать функцию рабочего пространства, как указано здесь. Это обеспечит большую гибкость, поскольку мы можем иметь более одной библиотеки. Пример структуры проекта:

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

Ответ 3

Другим форматом может быть репликация того, что сделал исходный код Crates.io, если у вас крупный проект, что-то вроде:

Главная библиотека в src, с папкой Bin с вашими исполняемыми файлами. Затем сделайте вызовы в основной ящик библиотеки из ваших исполняемых файлов.

Таким образом, ваша библиотека является централизованной, поэтому ее проще находить в кэше.