Solusi alternatif adalah tidak benar-benar mencoba menjejalkan kedua hal ke dalam satu paket. Untuk proyek yang sedikit lebih besar dengan eksekusi yang ramah, saya merasa senang menggunakan ruang kerja
Kami membuat proyek biner yang menyertakan perpustakaan di dalamnya:
the-binary
├── Cargo.lock
├── Cargo.toml
├── mylibrary
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
Cargo.toml
Ini menggunakan [workspace]
kunci dan tergantung pada perpustakaan:
[package]
name = "the-binary"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]
[workspace]
[dependencies]
mylibrary = { path = "mylibrary" }
src / main.rs
extern crate mylibrary;
fn main() {
println!("I'm using the library: {:?}", mylibrary::really_complicated_code(1, 2));
}
mylibrary / src / lib.rs
use std::error::Error;
pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<Error>> {
Ok(a + b)
}
Dan jalankan:
$ cargo run
Compiling mylibrary v0.1.0 (file:///private/tmp/the-binary/mylibrary)
Compiling the-binary v0.1.0 (file:///private/tmp/the-binary)
Finished dev [unoptimized + debuginfo] target(s) in 0.73 secs
Running `target/debug/the-binary`
I'm using the library: Ok(3)
Ada dua manfaat besar untuk skema ini:
Biner sekarang dapat menggunakan dependensi yang hanya berlaku untuknya. Misalnya, Anda dapat memasukkan banyak peti untuk meningkatkan pengalaman pengguna, seperti parser baris perintah atau pemformatan terminal. Tidak satu pun dari ini akan "menginfeksi" perpustakaan.
Ruang kerja mencegah membangun berlebihan dari setiap komponen. Jika kita menjalankan cargo build
keduanya pada direktori mylibrary
dan the-binary
, perpustakaan tidak akan dibangun dua kali - itu dibagi antara kedua proyek.