Alternatif bir çözüm, her iki şeyi de tek bir pakete sıkıştırmaya çalışmak değildir. Dostça yürütülebilir bir dosyaya sahip biraz daha büyük projeler için, bir çalışma alanı kullanmak çok güzel buldum
İçinde bir kütüphane bulunan bir ikili proje yaratırız:
the-binary
├── Cargo.lock
├── Cargo.toml
├── mylibrary
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
Cargo.toml
Bu, [workspace]
anahtarı kullanır ve kütüphaneye bağlıdır:
[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)
}
Ve yürütün:
$ 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)
Bu şemanın iki büyük faydası vardır:
İkili dosya artık yalnızca geçerli olan bağımlılıkları kullanabilir. Örneğin, kullanıcı deneyimini geliştirmek için komut satırı ayrıştırıcıları veya terminal biçimlendirmesi gibi birçok kasa ekleyebilirsiniz. Bunların hiçbiri kütüphaneye “bulaşmayacak”.
Çalışma alanı, her bir bileşenin gereksiz yapılarını önler. cargo build
Hem mylibrary
ve hem de the-binary
dizinde çalışırsak , kitaplık iki kez oluşturulmaz - her iki proje arasında paylaşılır.