Wie benutzt man eine lokale unveröffentlichte Kiste?

102

Ich habe eine Bibliothek erstellt:

cargo new my_lib

und ich möchte diese Bibliothek in einem anderen Programm verwenden:

cargo new my_program --bin
extern crate my_lib;

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

Was muss ich tun, damit dies funktioniert?

Sie befinden sich nicht im selben Projektordner.

.
├── my_lib
└── my_program

Hoffentlich macht das Sinn.

Ich dachte, ich könnte den Pfad gemäß dem Frachtführer überschreiben , aber es heißt

Mit dieser Funktion können Sie Cargo nicht mitteilen, wie lokale unveröffentlichte Kisten zu finden sind.

Dies ist bei Verwendung der neuesten stabilen Version von Rust (1.3) der Fall.

Andre S.
quelle

Antworten:

135

Fügen Sie der Cargo.toml Ihrer ausführbaren Datei einen Abhängigkeitsabschnitt hinzu und geben Sie den Pfad an:

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

oder die entsprechende alternative TOML:

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

Weitere Informationen zum Festlegen von Abhängigkeiten finden Sie in den Frachtdokumenten, z. B. zur Verwendung eines Git-Repositorys anstelle eines lokalen Pfads.

Shepmaster
quelle
8
Gibt es eine Möglichkeit, eine lokale Kiste selbst (für die Entwicklung) zu verwenden, während Cargo.toml auf crates.io verweist, damit andere auch meinen Code erstellen können?
David Roundy
1
Derzeit standardmäßig nicht möglich. Sie können jedoch an einem lokalen Zweig arbeiten, Cargo.toml durch lokale Abhängigkeitsreferenzen (oder gemischte Referenzen) ersetzen und vor dem Zusammenführen oder während der Zusammenführung die Hauptdatei Cargo.toml wiederherstellen oder beibehalten.
Paul-Sebastian Manole
7
@DavidRoundy Wenn Sie immer noch nach einer Antwort suchen, können Sie jetzt das tun, was Sie verlangen. Sie können beide versionund pathfür eine Abhängigkeit angeben und es wird das pathTeil
entfernen
Eine ausführliche Dokumentation finden Sie unter doc.rust-lang.org/cargo/reference/…
David J.
1
Ist es möglich, dasselbe zu tun, aber mit gitstatt version? So etwas, my_lib = { path = "...", git = "..." }damit ich meine lokale Kopie während der Entwicklung und den Remote-Git verwenden kann, wenn jemand das Repo klont und versucht, das Programm zu kompilieren?
Ruben Kostandyan
0

Ich suchte nach einem Äquivalent zu mvn install . Diese Frage ist zwar kein Duplikat meiner ursprünglichen Frage, aber jeder, der über meine ursprüngliche Frage stolpert und dem Link hier folgt, findet eine vollständigere Antwort.

Die Antwort lautet: "Es gibt kein Äquivalent zu mvn install weil Sie den Pfad in der Datei" Cargo.toml "hart codieren müssen, was auf dem Computer eines anderen wahrscheinlich falsch ist, aber Sie können ziemlich nahe kommen."

Die vorhandene Antwort ist etwas kurz und ich musste ein bisschen länger herumwirbeln, um die Dinge tatsächlich zum Laufen zu bringen. Deshalb hier mehr Details:

/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 enthält diesen Absatz, der die Antwort von Shepmaster widerspiegelt:

Wenn Sie versucht haben, ein Modul aus einer externen Kiste zu verwenden, haben Sie möglicherweise die extern crateDeklaration verpasst (die normalerweise in der Kistenwurzel platziert ist):

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

use core::any;

Wechsel von, useum extern cratemir folgendes zu bringen:

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

Ich musste einen pubauf die Vorderseite dieser Funktion schlagen

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

Jetzt gehts.

Mutant Bob
quelle
2
Und jetzt ist diese Antwort ein Miniaturartikel: lilafrog.com/~thoth/rust-external-libraries
Mutant Bob