Используя Cargo, мы можем легко создать проект библиотеки с помощью команды new
:
cargo new pumpkin-rs --lib
Конечно, основная цель библиотек — это инкапсуляция некоторой функциональности, которая затем может быть экспортирована для использования другими библиотеками или приложениями.
Для целей этой заметки давайте определим простую функцию в src/lib.rs
, которая будет сутью нашей библиотеки. Позже мы увидим, как можно использовать эту функцию из запускаемой бинарной цели в том же проекте.
pub fn say_hello() {
println!("Hello from the library");
}
Вы можете запустить cargo build
, чтобы дважды убедиться, что все успешно собрано… и вуаля!
Цели Cargo
В некоторых ситуациях может быть полезно, чтобы проект библиотеки включал в себя запускаемый компонент — автономную, запускаемую программу, которая может быть выполнена.
Цели Cargo позволяют нам определить различные комбинации исходных файлов, которые могут быть скомпилированы в проекте. Цели могут определять, какая часть исходного кода является библиотекой, бинарным файлом, примером, модульным тестом или эталоном.
Самое интересное, что Cargo также использует соглашения о структуре папок, чтобы определить, какой исходный файл что делает. Например, src/lib.rs
— это место, где он будет искать библиотечный код, исполняемый код ожидается в src/main.rs
или src/bin/
.
Добавление двоичной цели по умолчанию
Следуя приведенным выше соглашениям, мы можем добавить исполняемый файл по умолчанию в библиотечный проект, создав src/bin/pumpkin.rs
:
use pumpkin_rs::say_hello;
fn main() {
say_hello()
}
Запуск cargo run
выполнит бинарный файл! 🎉
Мало того, cargo build
теперь также выдает 2 отдельных результата — мы получаем скомпилированный бинарник для библиотеки, а также исполняемый файл.
Более чем одна двоичная цель
Мы не ограничены одной бинарной целью. Их может быть несколько!
Давайте создадим src/bin/tomato.rs
.
fn main() {
println!("Hello 🍅")
}
Теперь, если мы просто запустим cargo run
, как и раньше, мы получим сообщение об ошибке, потому что есть две доступные двоичные цели, и cargo не знает, какую из них мы хотим использовать. Сообщение об ошибке подсказывает, что мы можем использовать конфигурацию цели в Cargo.toml
для определения ключа default-run
или передать аргумент --bin
команде run
.
cargo run --bin tomato