Что такое «ящик» в грузовой экосистеме и как он соотносится с тем, что находится на crates.io? - PullRequest
0 голосов
/ 26 августа 2018

Я немного сбит с толку относительно точных вещей, размещенных на crates.io («ящик» - правильный способ ссылаться на них)? Насколько я понимаю, ящик - это единица компиляции в Rust, но тогда каково соответствие между ящиками и тем, что находится на crates.io? Например, Приложение Rust Programming Language в макросах говорит, что, поскольку в ящике может быть только один процедурный макрос:

Наши два ящика тесно связаны, поэтому мы создаем процедурный макро-ящик в каталоге нашего hello_macro ящика. Если мы изменим определение признака в hello_macro, нам также придется изменить реализацию процедурного макроса в hello_macro_derive. Эти два ящика нужно будет публиковать отдельно, и программисты, использующие эти ящики, должны будут добавить оба в качестве зависимостей и перенести их в область видимости. Вместо этого мы могли бы использовать ящик hello_macro, использующий hello_macro_derive в качестве зависимости, и повторно экспортировать код процедурного макроса. Но то, как мы структурировали проект, позволяет программистам использовать hello_macro, даже если им не нужна функциональность derive.

Он должен быть опубликован отдельно на crates.io. Это кажется довольно ясным: ящик на crates.io - это то же самое, что и локальный ящик, и сопоставление один к одному.

Однако при обсуждении проектов как с исполняемым файлом, так и с библиотекой это подразумевает, что они являются отдельными ящиками, но не должны публиковаться отдельно. Например, в репозитории sccache есть как main.rs, так и lib.rs. Разве отдельный двоичный ящик на самом деле не хранится в crates.io и находится только в репо? Тогда как грузовые установки выясняют, что устанавливать?

Что такое "пакет"?

Я попытался запустить cargo package с примером проекта, который содержит двоичные и библиотечные цели. И оба были добавлены в файл .cargo (кстати, точный формат архивов .cargo задокументирован в любом месте ?). Это все еще оставляет меня в замешательстве. Можем ли мы опубликовать несколько ящиков как часть одного пакета? Должны ли мы ссылаться на то, что хранится в crates.io, как packages ? Правильно ли я предполагаю, что каждый пакет может содержать несколько двоичных ящиков, но только один ящик библиотеки? Это мое текущее понимание.

1 Ответ

0 голосов
/ 29 августа 2018

Точные данные, размещенные на crates.io, - это ящики внутри пакетов.

A crate - это выходной артефакт компилятора.

Из Справочное руководство по Rust :

Модель компиляции сосредоточена на артефактах, называемых ящиками.Каждая компиляция обрабатывает один ящик в исходной форме и в случае успеха создает один ящик в двоичной форме: либо исполняемый файл, либо какая-либо библиотека.

A package артефакт, управляемый Cargo, менеджером пакетов Rust.

Cargo.toml файл манифеста определяет пакет с синтаксисом:

[package]
name = "hello_world"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]  

Пакет может содержать один или несколько ящиков, например одну библиотекуcrate, , названный именем пакета и ноль или более исполняемых ящиков, каждый из которых определен явно в разделе [[bin]] файла манифеста или неявно, если он находится внутри каталога src/bin пакета.

В книжке Cargo в качестве псевдонима для пакета используется термин crate.Рассмотрим следующее утверждение, чтобы попытаться немного разобраться в этом:

Обычно * основным артефактом пакета является ящик библиотеки, и, поскольку он идентифицируется с именем пакета, принято рассматривать пакет и ящик каксинонимы.

*: пакет может содержать только двоичный файл, см., например, ripgrep

...