Làm thế nào để sử dụng một thùng chưa được xuất bản cục bộ?


102

Tôi đã tạo một thư viện:

cargo new my_lib

và tôi muốn sử dụng thư viện đó trong một chương trình khác:

cargo new my_program --bin
extern crate my_lib;

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

Tôi cần phải làm gì để làm việc này?

Chúng không nằm trong cùng một thư mục dự án.

.
├── my_lib
└── my_program

Hy vọng rằng điều này có ý nghĩa.

Tôi nghĩ rằng tôi có thể ghi đè con đường theo Hướng dẫn hàng hóa , nhưng nó nói

Bạn không thể sử dụng tính năng này để cho Cargo biết cách tìm các thùng chưa được xuất bản tại địa phương.

Đây là khi sử dụng phiên bản ổn định mới nhất của Rust (1.3).

Câu trả lời:


135

Thêm phần phụ thuộc vào Cargo.toml của tệp thực thi của bạn và chỉ định đường dẫn:

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

hoặc TOML thay thế tương đương:

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

Xem tài liệu về Cargo để chỉ định các phần phụ thuộc để biết thêm chi tiết, chẳng hạn như cách sử dụng kho git thay vì đường dẫn cục bộ.


8
Có cách nào để tự sử dụng một thùng cục bộ (để phát triển) trong khi để Cargo.toml tham chiếu đến crates.io để những người khác cũng có thể xây dựng mã của tôi không?
David Roundy

1
Không thể theo mặc định vào lúc này. Tuy nhiên, bạn có thể làm việc trên một nhánh cục bộ, thay thế Cargo.toml bằng các tham chiếu phụ thuộc cục bộ (hoặc các tham chiếu hỗn hợp) và trước khi hợp nhất hoặc trong khi, hãy hoàn nguyên về hoặc giữ tệp Cargo.toml chính.
Paul-Sebastian Manole

7
@DavidRoundy nếu bạn vẫn đang tìm kiếm câu trả lời, bây giờ bạn có thể thực hiện những gì bạn đang yêu cầu. Bạn có thể chỉ định cả hai versionpathcho một phần phụ thuộc và nó sẽ loại bỏ pathphần đó khi bạn xuất bản nó :)
Connie Hilarides

Tài liệu chi tiết có tại doc.rust-lang.org/cargo/reference/…
David J.

1
Có thể làm tương tự nhưng với gitthay vì version? Một cái gì đó như thế này my_lib = { path = "...", git = "..." }để tôi có thể sử dụng bản sao cục bộ của mình trong quá trình phát triển và git từ xa khi ai đó sao chép repo và cố gắng biên dịch chương trình?
Ruben Kostandyan

0

Tôi đã tìm kiếm một tương đương với mvn install. Mặc dù câu hỏi này không hoàn toàn trùng lặp với câu hỏi ban đầu của tôi, nhưng bất kỳ ai tình cờ xem được câu hỏi ban đầu của tôi và theo liên kết ở đây sẽ tìm thấy câu trả lời đầy đủ hơn.

Câu trả lời là "không có gì tương đương với mvn installvì bạn phải mã hóa đường dẫn trong tệp Cargo.toml mà có thể sẽ bị sai trên máy tính của người khác, nhưng bạn có thể đến khá gần."

Câu trả lời hiện tại là một chút ngắn gọn và tôi đã phải loanh quanh lâu hơn một chút để mọi thứ thực sự hoạt động, vì vậy đây là chi tiết hơn:

/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 bao gồm đoạn này lặp lại câu trả lời của Shepmaster:

Hoặc, nếu bạn đã cố gắng sử dụng một mô-đun từ thùng bên ngoài, bạn có thể đã bỏ sót phần extern cratekhai báo (thường được đặt trong gốc thùng):

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

use core::any;

Chuyển từ useđể extern cratetôi nhận được điều này:

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

Tôi đã phải tát pubvào mặt trước của chức năng đó

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

Bây giờ nó hoạt động.


2
Và bây giờ câu trả lời này là một bài viết thu nhỏ: purplefrog.com/~thoth/rust-external-libraries
Mutant Bob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.