Comment utiliser une caisse locale non publiée?

103

J'ai fait une bibliothèque:

cargo new my_lib

et je souhaite utiliser cette bibliothèque dans un programme différent:

cargo new my_program --bin
extern crate my_lib;

fn main {
    println!("Hello, World!");
}

que dois-je faire pour que cela fonctionne?

Ils ne sont pas dans le même dossier de projet.

.
├── my_lib
└── my_program

J'espère que cela a du sens.

Je pensais pouvoir ignorer le chemin selon le guide Cargo , mais il indique

Vous ne pouvez pas utiliser cette fonction pour indiquer à Cargo comment trouver des caisses locales non publiées.

C'est lors de l'utilisation de la dernière version stable de Rust (1.3).

André S.
la source

Réponses:

137

Ajoutez une section de dépendance au Cargo.toml de votre exécutable et spécifiez le chemin:

[dependencies.my_lib]
path = "../my_lib"

ou le TOML alternatif équivalent:

[dependencies]
my_lib = { path = "../my_lib" }

Consultez la documentation Cargo pour spécifier les dépendances pour plus de détails, comme comment utiliser un référentiel git au lieu d'un chemin local.

Shepmaster
la source
8
Existe-t-il un moyen d'utiliser moi-même une caisse locale (pour le développement) tout en laissant Cargo.toml faisant référence à crates.io afin que d'autres puissent également créer mon code?
David Roundy
1
Pas possible par défaut pour le moment. Vous pouvez cependant travailler sur une branche locale, remplacer Cargo.toml par des références de dépendance locales (ou des références mixtes), et avant de fusionner ou pendant, revenir ou conserver le fichier principal Cargo.toml.
Paul-Sebastian Manole
7
@DavidRoundy si vous cherchez toujours une réponse, il est maintenant possible de faire ce que vous demandez. Vous pouvez spécifier les deux versionet pathpour une dépendance et cela pathsupprimera la partie lorsque vous la publiez :)
Connie Hilarides
Une documentation détaillée est disponible sur doc.rust-lang.org/cargo/reference/…
David J.
1
Est-il possible de faire la même chose mais avec gitau lieu de version? Quelque chose comme ça my_lib = { path = "...", git = "..." }pour que je puisse utiliser ma copie locale pendant le développement et le git distant quand quelqu'un clone le dépôt et essaie de compiler le programme?
Ruben Kostandyan
0

Je cherchais un équivalent à mvn install. Bien que cette question ne soit pas tout à fait une copie de ma question initiale, quiconque tombe sur ma question initiale et suit le lien ici trouvera une réponse plus complète.

La réponse est "il n'y a pas d'équivalent à mvn installparce que vous devez coder en dur le chemin dans le fichier Cargo.toml qui sera probablement erroné sur l'ordinateur de quelqu'un d'autre, mais vous pouvez vous en approcher assez."

La réponse existante est un peu brève et j'ai dû me débattre un peu plus longtemps pour que les choses fonctionnent, alors voici plus de détails:

/usr/bin/cargo run --color=always --package re5 --bin re5
   Compiling re5 v0.1.0 (file:///home/thoth/art/2019/radial-embroidery/re5)
error[E0432]: unresolved import `embroidery_stitcher`
 --> re5/src/main.rs:5:5
  |
5 | use embroidery_stitcher;
  |     ^^^^^^^^^^^^^^^^^^^ no `embroidery_stitcher` in the root

rustc --explain E0432 inclut ce paragraphe qui fait écho à la réponse de Shepmaster:

Ou, si vous avez essayé d'utiliser un module à partir d'une caisse externe, vous avez peut-être manqué la extern cratedéclaration (qui est généralement placée dans la racine de la caisse):

extern crate core; // Required to use the `core` crate

use core::any;

Passer de useà extern cratem'a obtenu ceci:

/usr/bin/cargo run --color=always --package re5 --bin re5
   Compiling embroidery_stitcher v0.1.0 (file:///home/thoth/art/2019/radial-embroidery/embroidery_stitcher)
warning: function is never used: `svg_header`
 --> embroidery_stitcher/src/lib.rs:2:1
  |
2 | fn svg_header(w: i32, h: i32) -> String
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(dead_code)] on by default

   Compiling re5 v0.1.0 (file:///home/thoth/art/2019/radial-embroidery/re5)
error[E0603]: function `svg_header` is private
 --> re5/src/main.rs:8:19
  |
8 |     let mut svg = embroidery_stitcher::svg_header(100,100);
  |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

J'ai dû gifler un pubsur le devant de cette fonction

pub fn svg_header(w: i32, h: i32) -> String

Maintenant ça marche.

Bob mutant
la source
2
Et maintenant, cette réponse est un article miniature: purplefrog.com/~thoth/rust-external-libraries
Mutant Bob