Jak mogę zbudować wiele plików binarnych za pomocą Cargo?

106

Chciałbym zrobić projekt z a daemoni client, łącząc się przez gniazdo unixowe.

A clienti a daemonwymagają dwóch plików binarnych, więc jak mam Cargozbudować dwa cele z dwóch różnych źródeł?

Aby dodać trochę fantazji, chciałbym mieć librarygłówną część daemoni po prostu mieć plik binarny, aby go owinąć i komunikować przez gniazda.

Mamy więc taką architekturę drzewa:

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

Mógłbym stworzyć jeden plik wykonywalny, który zarządza obydwoma problemami, ale to nie jest to, co chcę robić, chyba że jest to bardzo dobra praktyka.

RallionRl
źródło
Jako uzupełnienie odpowiedzi Dognerta odpowiadają na wszystkie pytania, które otrzymałem. Dziękuję bardzo!
RallionRl

Odpowiedzi:

138

Możesz określić wiele plików binarnych za pomocą [[bin]], jak wspomniano tutaj :

[[bin]]
name = "daemon"
path = "src/daemon/bin/main.rs"

[[bin]]
name = "client"
path = "src/client/bin/main.rs"

Wskazówka: jeśli zamiast tego umieścisz te pliki w src/bin/daemon.rsi src/bin/client.rs, otrzymasz dwa pliki wykonywalne o nazwie daemoni clientgdy Cargo automatycznie kompiluje wszystkie pliki src/bindo plików wykonywalnych o tej samej nazwie. Musisz podać nazwy i ścieżki, jak w powyższym fragmencie, tylko jeśli nie przestrzegasz tej konwencji.

Dogbert
źródło
Przejrzałem dokumentację Cargo, ale nic nie widzę, możesz określić wyjście do przechowywania binarnego? na przykład pathTo: "/ some / path" Przepraszam za mój angielski.
Angel Angel,
jeśli uważasz, że lepiej jest zadać pytanie na ten temat, mogę to zrobić bez problemu, może łatwiej byłoby znaleźć innych z tym samym pytaniem?
Angel Angel,
@AngelAngel chcesz dostosować ścieżkę wyjściową? Domyślnie będzie ona być przechowywana w target/debug/$namektórym $namejest nameokreślić w Cargo.toml.
Dogbert,
Zastanawiałem się tylko, czy możesz powiedzieć, gdzie zainstalować kopię pliku binarnego w innym miejscu niż domyślny. Kopia w $ name i kolejna kopia w innej ścieżce. Nie żeby to było trywialne, po prostu ciekawe, dziękuję za poświęcony czas.
Angel Angel,
@AngelAngel Myślę, że szukasz cargo installpolecenia. Spróbuj odczytać dane wyjściowe cargo help install.
Dogbert,
18

Innym sposobem jest użycie funkcji obszaru roboczego . Zapewni to większą elastyczność, ponieważ możemy mieć więcej niż jedną bibliotekę. Przykładowa struktura projektu:

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

Zawartość korzenia Cargo.toml:

[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]
UltimaWeapon
źródło
1
Nie mogłem zmusić tego do pracy. Musiałem przenieść binarne źródło rdzy do folderu src / i określić inny cel w [[bin]]. Czy mógłbyś podać więcej szczegółów na temat tego, co zrobiłeś, aby to zadziałało? Otrzymałem następujący błąd: use ::engine::RuleEngine; could not find engine in {{root}}
Kenny Bambridge
@KennyBambridge Od jakiegoś czasu nie pracowałem nad Rustem. IIRC, kiedy utworzyłem tę odpowiedź, wypróbowałem na moim komputerze lokalnym i działa zgodnie z przeznaczeniem.
UltimaWeapon
@KennyBambridge Musisz dodać skrzynie w innych obszarach roboczych jako zależności w Cargo.toml, gdzie chcesz ich używać.
Caesar
1

Innym formatem może być powielenie tego, co zrobił kod źródłowy Crates.io , jeśli masz ogromny projekt, na przykład:

Biblioteka główna w src, z folderem Bin z twoimi plikami wykonywalnymi. Następnie wykonaj wywołania ze swoich plików wykonywalnych do głównej skrzynki biblioteki.

W ten sposób biblioteka jest scentralizowana, co ułatwia znajdowanie rzeczy w pamięci podręcznej.

Solidne systemy 8472-1488
źródło