Як я можу створити кілька бінарних файлів за допомогою 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.
Догберт

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

@AngelAngel Я думаю, ви шукаєте cargo installкоманду. Спробуйте прочитати результати cargo help install.
Догберт

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.