Une autre solution consiste à ne pas essayer de regrouper les deux choses dans un seul paquet. Pour les projets légèrement plus grands avec un exécutable convivial, j'ai trouvé très agréable d'utiliser un espace de travail
Nous créons un projet binaire qui comprend une bibliothèque à l'intérieur:
the-binary
├── Cargo.lock
├── Cargo.toml
├── mylibrary
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
Cargo.toml
Cela utilise la [workspace]
clé et dépend de la bibliothèque:
[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)
}
Et exécutez-le:
$ 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)
Il y a deux grands avantages à ce programme:
Le binaire peut désormais utiliser des dépendances qui ne s'appliquent qu'à lui. Par exemple, vous pouvez inclure de nombreuses caisses pour améliorer l'expérience utilisateur, telles que des analyseurs de ligne de commande ou le formatage du terminal. Aucun de ceux-ci ne «infectera» la bibliothèque.
L'espace de travail empêche les versions redondantes de chaque composant. Si nous exécutons cargo build
à la fois le répertoire mylibrary
et the-binary
, la bibliothèque ne sera pas créée les deux fois - elle est partagée entre les deux projets.
cargo build --verbose
, vous les verrez enrustc
ligne de commande.[[bin]]
un tableau de tableaux? Pourquoi utiliser[[bin]]
et non[bin]
? Il ne semble pas y avoir de documentation à ce sujet.