Eine alternative Lösung besteht darin, nicht zu versuchen, beide Dinge in einem Paket zusammenzufassen. Für etwas größere Projekte mit einer benutzerfreundlichen ausführbaren Datei fand ich es sehr schön, eine zu verwenden Arbeitsbereich zu verwenden
Wir erstellen ein Binärprojekt, das eine Bibliothek enthält:
the-binary
├── Cargo.lock
├── Cargo.toml
├── mylibrary
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
Cargo.toml
Dies verwendet den [workspace]
Schlüssel und hängt von der Bibliothek ab:
[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)
}
Und führen Sie es aus:
$ 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)
Dieses System bietet zwei große Vorteile:
Die Binärdatei kann jetzt Abhängigkeiten verwenden, die nur für sie gelten. Sie können beispielsweise viele Kisten einfügen, um die Benutzererfahrung zu verbessern, z. B. Befehlszeilen-Parser oder Terminal-Formatierung. Keines davon "infiziert" die Bibliothek.
Der Arbeitsbereich verhindert redundante Builds jeder Komponente. Wenn wir cargo build
sowohl im Verzeichnis mylibrary
als auch im the-binary
Verzeichnis ausführen , wird die Bibliothek nicht beide Male erstellt - sie wird von beiden Projekten gemeinsam genutzt.