Як використовувати місцевий неопублікований ящик?


103

Я створив бібліотеку:

cargo new my_lib

і я хочу використовувати цю бібліотеку в іншій програмі:

cargo new my_program --bin
extern crate my_lib;

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

що мені потрібно зробити, щоб це працювало?

Вони не в одній папці проекту.

.
├── my_lib
└── my_program

Сподіваємось, це має сенс.

Я думав, що зможу перемогти шлях відповідно до вантажного довідника , але він констатує

Ви не можете скористатися цією функцією, щоб сказати Cargo, як знайти місцеві неопубліковані ящики.

Це під час використання останньої стабільної версії Rust (1.3).

Відповіді:


137

Додайте розділ залежності до Cargo.toml вашого виконуваного файлу та вкажіть шлях:

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

або еквівалентний альтернативний TOML:

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

Ознайомтеся з документами Cargo, щоб детальніше вказати залежності , наприклад, як використовувати сховище git замість локального шляху.


8
Чи є спосіб використовувати місцевий ящик сам (для розробки), залишаючи Cargo.toml з посиланням на crates.io, щоб інші також могли створити мій код?
Девід Круглий

1
Наразі це неможливо за замовчуванням. Однак ви можете працювати в локальній гілці, замінювати Cargo.toml на локальні посилання на залежність (або змішані посилання), і перед тим як об’єднати або під час, повернути до головного файлу Cargo.toml або зберегти його.
Пол-Себастьян Маноле

7
@DavidRoundy, якщо ти все ще шукаєш відповіді, тепер можна робити те, що ти просиш. Ви можете вказати versionі pathзалежність, і вона path
зніме

Детальна документація доступна на doc.rust-lang.org/cargo/reference/…
Девід Дж.

1
Чи можна робити те саме, але gitзамість цього version? Щось подібне, my_lib = { path = "...", git = "..." }щоб я міг використовувати свою локальну копію під час розробки та віддалений git, коли хтось клонує репо і намагається скласти програму?
Рубен

0

Я шукав еквівалент mvn install. Незважаючи на те, що це питання не є дублікатом мого оригінального запитання, кожен, хто наткнеться на моє оригінальне запитання та переходить за посиланням, знайде більш повну відповідь.

Відповідь "немає еквіваленту mvn installтому, що вам доведеться жорстко кодувати шлях у файлі Cargo.toml, який, ймовірно, помиляється на чужому комп'ютері, але ви можете дуже близько".

Існуюча відповідь трохи коротка, і мені довелося розгорнутись трохи довше, щоб реально працювати, тому ось детальніше:

/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 включає цей параграф, який повторює відповідь Шепмастера:

Або якщо ви спробували використати модуль із зовнішньої ящика, можливо, ви пропустили extern crateдекларацію (яка зазвичай розміщується у корені ящика):

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

use core::any;

Перехід від useдо extern crateу мене це:

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

Мені довелося ляпати pubпо передній частині цієї функції

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

Зараз це працює.


2
А тепер ця відповідь - мініатюрна стаття: purplefrog.com/~thoth/rust-external-libraries
Мутант Боб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.