Bagaimana cara menggunakan peti lokal yang tidak dipublikasikan?

103

Saya telah membuat perpustakaan:

cargo new my_lib

dan saya ingin menggunakan pustaka itu di program lain:

cargo new my_program --bin
extern crate my_lib;

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

apa yang harus saya lakukan agar ini berfungsi?

Mereka tidak ada di folder proyek yang sama.

.
├── my_lib
└── my_program

Semoga ini masuk akal.

Saya pikir saya akan bisa mengganti jalur sesuai panduan Kargo , tetapi itu menyatakan

Anda tidak dapat menggunakan fitur ini untuk memberi tahu Cargo bagaimana menemukan peti lokal yang tidak dipublikasikan.

Ini adalah saat menggunakan versi stabil terbaru dari Rust (1.3).

Andre S.
sumber

Jawaban:

137

Tambahkan bagian dependensi ke Cargo.toml yang dapat dieksekusi dan tentukan jalurnya:

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

atau TOML alternatif yang setara:

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

Lihat dokumen Cargo untuk menentukan dependensi untuk detail lebih lanjut, seperti cara menggunakan repositori git alih-alih jalur lokal.

Shepmaster
sumber
8
Apakah ada cara untuk menggunakan peti lokal sendiri (untuk pengembangan) sementara meninggalkan Cargo.toml mengacu pada crates.io sehingga orang lain juga dapat membuat kode saya?
David Roundy
1
Tidak mungkin secara default saat ini. Namun Anda dapat bekerja di cabang lokal, mengganti Cargo.toml dengan referensi ketergantungan lokal (atau referensi campuran), dan sebelum Anda menggabungkan atau selama, kembali ke atau pertahankan file utama Cargo.toml.
Paul-Sebastian Manole
7
@DavidRoundy jika Anda masih mencari jawaban, sekarang mungkin untuk melakukan apa yang Anda minta. Anda dapat menentukan keduanya versiondan pathuntuk sebuah dependensi dan itu akan menghapus pathbagian tersebut ketika Anda menerbitkannya :)
Connie Hilarides
Dokumentasi terperinci tersedia di doc.rust-lang.org/cargo/reference/…
David J.
1
Apakah mungkin untuk melakukan hal yang sama tetapi dengan gitalih - alih version? Sesuatu seperti ini my_lib = { path = "...", git = "..." }sehingga saya dapat menggunakan salinan lokal saya selama pengembangan dan remote git ketika seseorang mengkloning repo dan mencoba mengkompilasi program?
Ruben Kostandyan
0

Saya sedang mencari yang setara dengan mvn install. Meskipun pertanyaan ini bukan duplikat dari pertanyaan asli saya, siapa pun yang menemukan pertanyaan asli saya dan mengikuti tautan di sini akan menemukan jawaban yang lebih lengkap.

Jawabannya adalah "tidak ada padanan dengan mvn installkarena Anda harus melakukan hard-code pada jalur di file Cargo.toml yang mungkin akan salah di komputer orang lain, tetapi Anda bisa mendapatkan cukup dekat."

Jawaban yang ada agak singkat dan saya harus bermain-main sedikit lebih lama untuk benar-benar membuat semuanya berfungsi, jadi inilah detail lebih lanjut:

/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 sertakan paragraf ini yang menggemakan jawaban Shepmaster:

Atau, jika Anda mencoba menggunakan modul dari crate eksternal, Anda mungkin melewatkan extern cratedeklarasi (yang biasanya ditempatkan di root crate):

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

use core::any;

Beralih dari useuntuk extern cratememberi saya ini:

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

Saya harus menampar pubdi depan fungsi itu

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

Sekarang berhasil.

Bob Mutan
sumber
2
Dan sekarang jawaban ini adalah artikel miniatur: purplefrog.com/~thoth/rust-external-libraries
Mutant Bob