Jak korzystać z lokalnej niepublikowanej skrzynki?


103

Zrobiłem bibliotekę:

cargo new my_lib

i chcę użyć tej biblioteki w innym programie:

cargo new my_program --bin
extern crate my_lib;

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

co muszę zrobić, aby to zadziałało?

Nie znajdują się w tym samym folderze projektu.

.
├── my_lib
└── my_program

Mam nadzieję, że to ma sens.

Pomyślałem, że będę w stanie pokonać ścieżkę zgodnie z przewodnikiem Cargo , ale stwierdza

Nie możesz użyć tej funkcji, aby powiedzieć Cargo, jak znaleźć lokalne niepublikowane skrzynie.

Dzieje się tak, gdy używasz najnowszej stabilnej wersji Rusta (1.3).

Odpowiedzi:


137

Dodaj sekcję zależności do pliku Cargo.toml i określ ścieżkę:

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

lub równoważny alternatywny TOML:

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

Zapoznaj się z dokumentacją Cargo, aby określić zależności, aby uzyskać więcej szczegółów, na przykład jak używać repozytorium git zamiast ścieżki lokalnej.


8
Czy istnieje sposób, aby samodzielnie wykorzystać lokalną skrzynkę (do programowania), opuszczając Cargo.toml w odniesieniu do crates.io, aby inni również mogli zbudować mój kod?
David Roundy

1
W tej chwili nie jest to możliwe domyślnie. Możesz jednak pracować w oddziale lokalnym, zastąpić Cargo.toml odwołaniami do lokalnych zależności (lub odniesieniami mieszanymi), a przed scaleniem lub w trakcie, przywrócić lub zachować główny plik Cargo.toml.
Paul-Sebastian Manole,

7
@DavidRoundy Jeśli nadal szukasz odpowiedzi, możesz teraz zrobić to, o co pytasz. Możesz określić oba versioni pathdla zależności, a pathczęść zostanie
usunięta

Szczegółowa dokumentacja jest dostępna pod adresem doc.rust-lang.org/cargo/reference/…
David J.

1
Czy można zrobić to samo, ale gitzamiast tego version? Coś takiego my_lib = { path = "...", git = "..." }, żebym mógł użyć mojej lokalnej kopii podczas programowania i zdalnego gita, gdy ktoś sklonuje repozytorium i spróbuje skompilować program?
Ruben Kostandyan

0

Szukałem odpowiednika mvn install . Chociaż to pytanie nie jest do końca powtórzeniem mojego pierwotnego pytania, każdy, kto natknie się na moje pierwotne pytanie i kliknie tutaj, znajdzie pełniejszą odpowiedź.

Odpowiedź brzmi: „nie ma odpowiednika mvn install ponieważ musisz na stałe zakodować ścieżkę w pliku Cargo.toml, co prawdopodobnie będzie błędne na czyimś komputerze, ale możesz podejść całkiem blisko”.

Obecna odpowiedź jest trochę krótka i musiałem się trochę dłużej męczyć, aby wszystko działało, więc oto więcej szczegółów:

/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 zawiera ten akapit, który odzwierciedla odpowiedź Shepmastera:

Lub, jeśli próbowałeś użyć modułu z zewnętrznej skrzynki, być może przegapiłeś extern cratedeklarację (która zwykle jest umieszczana w katalogu głównym skrzynki):

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

use core::any;

Przełączam się z, useaby extern cratedostać to:

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

Musiałem uderzyć pubz przodu tej funkcji

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

Teraz działa.


2
A teraz ta odpowiedź to miniaturowy artykuł: purplefrog.com/~thoth/rust-external-libraries
Mutant Bob
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.