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


95

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

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

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

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

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

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



В дополнение к ответу Догнерта они отвечают на все мои вопросы. Большое спасибо!
RallionRl

Ответы:


126

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


Я просмотрел документацию Cargo, но ничего не вижу, вы можете указать вывод для хранения двоичного файла? например pathTo: "/ some / path" Прошу прощения за мой английский.
Angel Angel

если вы считаете, что лучше задать вопрос по этому поводу, я могу сделать это без проблем, может быть проще найти других с тем же вопросом?
Angel Angel

@AngelAngel вы хотите настроить путь вывода? По умолчанию он будет храниться в том target/debug/$nameместе, $nameкоторое nameвы указали в Cargo.toml.
Dogbert

Мне просто интересно, можете ли вы сказать, где установить копию двоичного файла в другом месте, кроме значения по умолчанию. Копия в $ name и еще одна копия по другому пути. Не то чтобы это банально, просто любопытно, спасибо за уделенное время.
Angel Angel

@AngelAngel Я думаю, вы ищете cargo installкоманду. Попробуйте прочитать вывод cargo help install.
Dogbert

14

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

.
├── 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 с вашими исполняемыми файлами. Затем сделайте вызовы вашего основного ящика библиотеки из ваших исполняемых файлов.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.