web-dev-qa-db-fra.com

Comment utiliser une caisse locale non publiée?

J'ai fait une bibliothèque:

cargo new my_lib

et je veux utiliser cette bibliothèque dans un autre programme:

cargo new my_program --bin
extern crate my_lib;

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

que dois-je faire pour que cela fonctionne?

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

.
├── my_lib
└── my_program

J'espère que cela a du sens.

Je pensais que je serais en mesure de remplacer le chemin selon le Cargo guide , mais il indique

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

C'est lorsque vous utilisez la dernière version stable de Rust (1.3).

69
Andre S.

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 le Cargo docs 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.

90
Shepmaster

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

La réponse est "il n'y a pas d'équivalent à mvn install parce 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 rapprocher. "

La réponse actuelle est un peu brève et j'ai dû fouiller 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é le extern crate dé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;

Passage de use à extern crate m'a donné 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 pub sur le devant de cette fonction

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

Maintenant ça marche.

0
Mutant Bob