Я хотел бы сделать пакет Rust, который содержит как библиотеку многократного использования (где реализована большая часть программы), так и исполняемый файл, который ее использует.
Если я не перепутал семантику в модульной системе Rust, как должен Cargo.toml
выглядеть мой файл?
rust
rust-cargo
Эндрю Вагнер
источник
источник
cargo build --verbose
, вы увидите их вrustc
командной строке.[[bin]]
массив таблиц? Почему использовать,[[bin]]
а не[bin]
? Там, кажется, нет никакой документации по этому вопросу.Вы также можете просто добавить двоичные источники
src/bin
и остальные источникиsrc
. Вы можете увидеть пример в моем проекте . Вам не нужно ничего менятьCargo.toml
, и каждый исходный файл будет скомпилирован в двоичный файл с тем же именем.Конфигурация другого ответа затем заменяется на:
Cargo.toml
SRC / lib.rs
SRC / bin / mybin.rs
И выполнить это:
Кроме того, вы можете просто создать объект,
src/main.rs
который будет использоваться в качестве исполняемого файла defacto. К сожалению, это конфликтует сcargo doc
командой:источник
extern crate example;
не требуется с ржавчины 2018 года, вы можете напрямую написатьuse example::really_complicated_code;
и использовать функцию, не называя области действияАльтернативное решение - на самом деле не пытаться собрать обе вещи в один пакет. Для проектов чуть большего размера с дружественным исполняемым файлом я нахожу очень полезным использовать рабочее пространство
Мы создаем бинарный проект, который включает в себя библиотеку:
Cargo.toml
Это использует
[workspace]
ключ и зависит от библиотеки:SRC / main.rs
MyLibrary / SRC / lib.rs
И выполнить это:
У этой схемы есть два больших преимущества:
Двоичный файл теперь может использовать зависимости, которые применяются только к нему. Например, вы можете включить множество ящиков для улучшения взаимодействия с пользователем, таких как анализаторы командной строки или форматирование терминала. Ни один из них не «заразит» библиотеку.
Рабочая область предотвращает избыточные сборки каждого компонента. Если мы запустим
cargo build
как каталог, такmylibrary
иthe-binary
каталог, библиотека не будет собрана оба раза - она используется для обоих проектов.источник
main.rs
, а затем разбиваю его на модули по мере того, как он становится больше, в конце концов разделяется на то,src/bin
когда он становится немного больше, затем перехожу к рабочему пространству, когда начинаю интенсивно использовать основную логику.cargo test
похоже, игнорирует модульные тесты в lib.rscargo test --all
Вы можете положить
lib.rs
иmain.rs
в папку источников вместе. Там нет конфликта, и груз будет строить обе вещи.Для разрешения конфликта документации добавьте в свой
Cargo.toml
:источник