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

106

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

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

Андре С.
источник

Ответы:

141

Добавьте раздел зависимостей в 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
Мутант Боб