Je voudrais créer un package Rust contenant à la fois une bibliothèque réutilisable (où la plupart du programme est implémenté) et un exécutable qui l'utilise.
En supposant que je n'ai confondu aucune sémantique dans le système de modules Rust, à quoi mon Cargo.toml
fichier devrait-il ressembler?
rust
rust-cargo
Andrew Wagner
la source
la source
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.Vous pouvez également simplement insérer des sources binaires
src/bin
et le reste de vos sourcessrc
. Vous pouvez voir un exemple dans mon projet . Vous n'avez pas du tout besoin de modifier votreCargo.toml
, et chaque fichier source sera compilé dans un binaire du même nom.La configuration de l'autre réponse est alors remplacée par:
Cargo.toml
src / lib.rs
src / bin / mybin.rs
Et exécutez-le:
De plus, vous pouvez simplement créer un
src/main.rs
fichier qui sera utilisé comme exécutable de facto. Malheureusement, cela entre en conflit avec lacargo doc
commande:la source
extern crate example;
n'est pas nécessaire à partir de rust 2018, vous pouvez directement écrireuse example::really_complicated_code;
et utiliser la fonction sans nommer la portéeUne 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:
Cargo.toml
Cela utilise la
[workspace]
clé et dépend de la bibliothèque:src / main.rs
mylibrary / src / lib.rs
Et exécutez-le:
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épertoiremylibrary
etthe-binary
, la bibliothèque ne sera pas créée les deux fois - elle est partagée entre les deux projets.la source
main.rs
dedans, puis je le décompose en modules au fur et àsrc/bin
mesure qu'il s'agrandit, puis je me divise quand il est juste un peu plus grand, puis je passe à un espace de travail lorsque je commence à réutiliser massivement la logique de base.cargo test
correctement , mais semble ignorer les tests unitaires dans lib.rscargo test --all
Vous pouvez mettre
lib.rs
etmain.rs
vers le dossier sources ensemble. Il n'y a pas de conflit et la cargaison construira les deux choses.Pour résoudre un conflit de documentaion, ajoutez à votre
Cargo.toml
:la source