¿Cómo utilizar una caja local no publicada?

103

Hice una biblioteca:

cargo new my_lib

y quiero usar esa biblioteca en un programa diferente:

cargo new my_program --bin
extern crate my_lib;

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

¿Qué debo hacer para que esto funcione?

No están en la misma carpeta del proyecto.

.
├── my_lib
└── my_program

Ojalá esto tenga sentido.

Pensé que podría anular la ruta según la guía de Carga , pero dice

No puede usar esta función para decirle a Cargo cómo encontrar cajas locales no publicadas.

Esto es cuando se usa la última versión estable de Rust (1.3).

Andre S.
fuente

Respuestas:

136

Agregue una sección de dependencia al Cargo.toml de su ejecutable y especifique la ruta:

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

o el TOML alternativo equivalente:

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

Consulte los documentos de Cargo para especificar dependencias para obtener más detalles, como cómo usar un repositorio de git en lugar de una ruta local.

Pastor
fuente
8
¿Hay alguna manera de usar una caja local (para el desarrollo) mientras dejo Cargo.toml refiriéndose a crates.io para que otros también puedan construir mi código?
David Roundy
1
No es posible por defecto en este momento. Sin embargo, puede trabajar en una sucursal local, reemplazar Cargo.toml con referencias de dependencia local (o referencias mixtas) y, antes de fusionar o durante, revertir o mantener el archivo Cargo.toml principal.
Paul-Sebastian Manole
7
@DavidRoundy si todavía está buscando una respuesta, ahora es posible hacer lo que está pidiendo. Puede especificar ambos versiony pathpara una dependencia y eliminará la pathparte cuando la publique :)
Connie Hilarides
La documentación detallada está disponible en doc.rust-lang.org/cargo/reference/…
David J.
1
¿Es posible hacer lo mismo pero con en gitlugar de version? ¿Algo como esto my_lib = { path = "...", git = "..." }para que pueda usar mi copia local durante el desarrollo y el git remoto cuando alguien clona el repositorio e intenta compilar el programa?
Ruben Kostandyan
0

Estaba buscando un equivalente a mvn install . Si bien esta pregunta no es un duplicado de mi pregunta original, cualquiera que se encuentre con mi pregunta original y siga el enlace aquí encontrará una respuesta más completa.

La respuesta es "no hay equivalente a mvn install porque tienes que codificar la ruta en el archivo Cargo.toml, lo que probablemente será incorrecto en la computadora de otra persona, pero puedes acercarte bastante".

La respuesta existente es un poco breve y tuve que agitarme un poco más para que las cosas funcionaran, así que aquí hay más detalles:

/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 incluye este párrafo que hace eco de la respuesta de Shepmaster:

O, si intentó utilizar un módulo de una caja externa, es posible que se haya perdido la extern cratedeclaración (que generalmente se coloca en la raíz de la caja):

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

use core::any;

Cambiar de usea extern crateme consiguió esto:

/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);
  |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Tuve que dar una palmada puben la parte delantera de esa función

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

Ahora funciona.

Bob mutante
fuente
2
Y ahora esta respuesta es un artículo en miniatura: purplefrog.com/~thoth/rust-external-libraries
Mutant Bob