mrjbom
@mrjbom

Как работают пакеты и крейты?

Пытаюсь понять связь между пакетом и крейтом.
Крейт это то, что собирается в библиотеку или бинарный файл. Один крейт может включаться в другой(библиотечный в бинарный). Верно?
Тогда зачем нужен пакет? Как я понимаю, он содержит внутри себя крейты и отвечает за подключение к ним внешних зависимостей, что ещё он делает?
  • Вопрос задан
  • 146 просмотров
Решения вопроса 1
bingo347
@bingo347
Crazy on performance...
Крэйт - это в первую очередь дерево модулей. Каждый крэйт содержит как минимум 1 корневой модуль (обычно это main.rs или lib.rs, но так же это могут быть модули доп бинарников, модули интеграционных тестов, модули примеров). Так же к крэйту относятся модули, которые объявили в других модулях этого крейта (ключевое слово mod).
Помимо этого крэйт - это сущность которой оперирует компилятор rustc, крэйт является единицей компиляции, то есть в rustc на компиляцию попадает крэйт целиком (на вход подаём корневой модуль, а он уже сам бегает по всему дереву согласно объявлениям mod).

Пакет - это сущность которой оперирует cargo. Компилятор rustc ничего не знает про пакеты. По простому пакет это папка с файлом Cargo.toml, в котором есть секция package (бывают ещё Cargo.toml объявляющие только workspace). Пакет состоит из крейтов, притом должен быть как минимум 1 крейт бинарника или библиотеки, а библиотечный крейт может быть только 1 или отсутствовать вовсе.
Пакет - это то, что публикуется в registry (такие как crates.io).
Так же в зависимостях мы указываем именно пакеты (но только те, что содержат крэйт-библиотеку).
Так же именно пакеты указываются в команде cargo install, при этом будут собраны все бинарные крейты входящие в пакет, а получившиеся исполняемые файлы будут помещены .cargo/bin
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы