Come utilizzare una cassa locale inedita?


103

Ho creato una libreria:

cargo new my_lib

e voglio usare quella libreria in un programma diverso:

cargo new my_program --bin
extern crate my_lib;

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

cosa devo fare per farlo funzionare?

Non sono nella stessa cartella del progetto.

.
├── my_lib
└── my_program

Si spera che questo abbia senso.

Ho pensato di essere in grado di ignorare il percorso come da guida Cargo , ma afferma

Non è possibile utilizzare questa funzione per indicare a Cargo come trovare casse non pubblicate locali.

Questo è quando si utilizza l'ultima versione stabile di Rust (1.3).

Risposte:


137

Aggiungi una sezione delle dipendenze al tuo eseguibile Cargo.toml e specifica il percorso:

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

o l'equivalente TOML alternativo:

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

Consulta i documenti di Cargo per specificare le dipendenze per maggiori dettagli, ad esempio come utilizzare un repository git invece di un percorso locale.


8
C'è un modo per utilizzare io stesso una cassa locale (per lo sviluppo) lasciando Cargo.toml che fa riferimento a crates.io in modo che anche altri possano creare il mio codice?
David Roundy

1
Al momento non è possibile per impostazione predefinita. È tuttavia possibile lavorare su un ramo locale, sostituire Cargo.toml con riferimenti alle dipendenze locali (o riferimenti misti) e prima di unire o durante, ripristinare o mantenere il file Cargo.toml principale.
Paul-Sebastian Manole

7
@DavidRoundy se stai ancora cercando una risposta, ora è possibile fare quello che stai chiedendo. Puoi specificare sia versione pathper una dipendenza che path
eliminerà

La documentazione dettagliata è disponibile su doc.rust-lang.org/cargo/reference/…
David J.

1
È possibile fare lo stesso ma con gitinvece di version? Qualcosa di simile in my_lib = { path = "...", git = "..." }modo che io possa usare la mia copia locale durante lo sviluppo e il git remoto quando qualcuno clona il repository e cerca di compilare il programma?
Ruben Kostandyan

0

Stavo cercando un equivalente a mvn install . Sebbene questa domanda non sia esattamente un duplicato della mia domanda originale, chiunque si imbatti nella mia domanda originale e segua il collegamento qui troverà una risposta più completa.

La risposta è "non c'è equivalente a mvn install perché devi codificare il percorso nel file Cargo.toml che probabilmente sarà sbagliato sul computer di qualcun altro, ma puoi avvicinarti abbastanza".

La risposta esistente è un po 'breve e ho dovuto agitarmi un po' più a lungo per far funzionare effettivamente le cose, quindi ecco più dettagli:

/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 include questo paragrafo che fa eco alla risposta di Shepmaster:

Oppure, se hai provato a utilizzare un modulo da una cassa esterna, potresti aver perso la extern cratedichiarazione (che di solito è collocata nella radice della cassa):

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

use core::any;

Il passaggio da usea extern cratemi ha fatto questo:

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

Ho dovuto dare uno schiaffo a pubquella funzione

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

Ora funziona.


2
E ora questa risposta è un articolo in miniatura: purplefrog.com/~thoth/rust-external-libraries
Mutant Bob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.