Chciałbym zrobić projekt z a daemon
i client
, łącząc się przez gniazdo unixowe.
A client
i a daemon
wymagają dwóch plików binarnych, więc jak mam Cargo
zbudować dwa cele z dwóch różnych źródeł?
Aby dodać trochę fantazji, chciałbym mieć library
główną część daemon
i 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.
rust
rust-cargo
RallionRl
źródło
źródło
Odpowiedzi:
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.rs
isrc/bin/client.rs
, otrzymasz dwa pliki wykonywalne o nazwiedaemon
iclient
gdy Cargo automatycznie kompiluje wszystkie plikisrc/bin
do 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.źródło
target/debug/$name
którym$name
jestname
określić w Cargo.toml.cargo install
polecenia. Spróbuj odczytać dane wyjściowecargo help install
.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:
Zawartość korzenia
Cargo.toml
:[workspace] members = ["cli", "core", "daemon", "gui", "rpc"]
źródło
[[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}}
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.
źródło