Добавление исполняемой цели в библиотеку Rust

Используя 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
Вход в полноэкранный режим Выход из полноэкранного режима

Оцените статью
Procodings.ru
Добавить комментарий