Как использовать местный неопубликованный ящик?

Я сделал библиотеку:

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).

1 ответ

Решение

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

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

или эквивалентный альтернативный TOML:

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

Посмотрите документы Cargo для уточнения деталей, например, как использовать git-репозиторий вместо локального пути.

Я искал эквивалент 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

Теперь это работает.

Другие вопросы по тегам