Bagaimana saya bisa membangun banyak binari dengan Cargo?

95

Saya ingin membuat proyek dengan a daemondan a client, menghubungkan melalui soket unix.

A clientdan a daemonmembutuhkan dua biner, jadi bagaimana cara mengetahui Cargountuk membangun dua target dari dua sumber yang berbeda?

Untuk menambahkan sedikit fantasi, saya ingin memiliki librarybagian utama daemon, dan hanya memiliki biner untuk membungkusnya dan berkomunikasi melalui soket.

Jadi, kami memiliki arsitektur pohon semacam ini:

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

Saya dapat membuat satu yang dapat dieksekusi yang mengelola kedua masalah tersebut, tetapi bukan itu yang ingin saya lakukan, kecuali jika itu adalah praktik yang sangat baik.

RallionRl
sumber
1
Sangat relevan: Paket Rust dengan pustaka dan biner? .
Shepmaster
Dalam pelengkap Dognert ini jawaban, mereka menjawab semua pertanyaan yang saya punya. Terima kasih banyak!
RallionRl

Jawaban:

126

Anda dapat menentukan beberapa binari menggunakan [[bin]], seperti yang disebutkan di sini :

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

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

Tip: Jika Anda memasukkan file-file ini src/bin/daemon.rsdan src/bin/client.rs, Anda akan mendapatkan dua file yang dapat dieksekusi bernama daemondan clientsebagai Cargo mengkompilasi semua file src/binmenjadi file yang dapat dieksekusi dengan nama yang sama secara otomatis. Anda perlu menentukan nama dan jalur seperti pada cuplikan di atas hanya jika Anda tidak mengikuti konvensi ini.

Dogbert
sumber
Saya telah melihat Cargo dokumentasi, tetapi saya tidak dapat melihat apa-apa, Anda dapat menentukan output untuk menyimpan biner? misalnya pathTo: "/ some / path" Maaf bahasa Inggris saya.
Angel Angel
jika menurut Anda lebih baik membuat pertanyaan tentang ini, saya dapat melakukannya tanpa masalah, mungkin lebih mudah menemukan orang lain dengan pertanyaan yang sama?
Angel Angel
@AngelAngel Anda ingin menyesuaikan jalur keluaran? Secara default akan disimpan di target/debug/$nametempat $nameyang nameAnda tentukan di Cargo.toml.
Dogbert
Saya hanya bertanya-tanya apakah Anda bisa mengatakan di mana menginstal salinan biner di tempat lain selain default. Salinan dalam $ name dan salinan lain di jalur lain. Bukan itu sepele, hanya penasaran, terima kasih atas waktunya.
Malaikat Malaikat
@AngelAngel Saya pikir Anda sedang mencari cargo installperintah. Coba baca keluaran dari cargo help install.
Dogbert
14

Cara lain adalah dengan menggunakan fitur ruang kerja . Ini akan memberikan lebih banyak fleksibilitas karena kita dapat memiliki lebih dari satu perpustakaan. Contoh struktur proyek:

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

Isi root Cargo.toml:

[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]
UltimaWeapon
sumber
1
Saya tidak bisa mendapatkan ini untuk bekerja. Saya harus memindahkan sumber karat biner di folder src / dan menentukan target lain di [[bin]]. Bisakah Anda memberikan detail lebih lanjut tentang apa yang Anda lakukan agar ini berfungsi? Saya mendapatkan kesalahan berikut: use ::engine::RuleEngine; could not find engine in {{root}}
Kenny Bambridge
@KennyBeauty Saya belum mengerjakan Rust untuk sementara waktu. IIRC ketika saya membuat jawaban ini, saya mencoba di mesin lokal saya dan berfungsi sebagaimana mestinya.
UltimaWeapon
@KennyBambridge Anda harus menambahkan peti di ruang kerja lain sebagai dependensi di Cargo.toml tempat Anda ingin menggunakannya.
Caesar
1

Format lain bisa jadi meniru apa yang telah dilakukan kode sumber Crates.io , jika Anda memiliki proyek besar, seperti:

Perpustakaan Utama di src, dengan folder Bin dengan file executable Anda. Kemudian lakukan panggilan ke peti perpustakaan utama Anda dari file yang dapat dieksekusi.

Dengan cara itu perpustakaan Anda terpusat sehingga lebih mudah untuk menemukan hal-hal saat disimpan dalam cache.

Sistem yang Kuat 8472-1488
sumber