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.



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.


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"]

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.