В Rust появился cargo-bp, инструмент для выбора библиотек

Автор блога smallcultfollowing.com (babysteps), близкого к команде разработки Rust, описал идею «battery packs» («батарейных наборов»), курируемых подборок crates (библиотек с crates.io), собранных вокруг общей темы. Уже есть набор для CLI-приложений, набор для backend веб-сервисов, набор для embedded-разработки (составлен на основе репозитория Awesome Embedded Rust рабочей группы Rust по embedded-разработке) и более узкие наборы, например по обработке ошибок.

Идея отвечает на частую жалобу новичков в Rust: на crates.io много качественных библиотек, но сравнивать конкурирующие варианты и выбирать между ними, трудоёмко. Battery pack даёт набор рекомендаций по умолчанию, но не создаёт жёсткой зависимости, любой компонент набора можно заменить на альтернативу.

Автор выпустил рабочий прототип инструмента: команда cargo install cargo-bp ставит утилиту, cargo bp list показывает доступные наборы (они находятся через поиск по crates.io), а cargo bp add cli добавляет в проект типичные библиотеки для командной строки. Технически battery pack, это обычный crate с именем вида X-battery-pack; его зависимости и есть рекомендации, а «features» этого crate задают типичные комбинации библиотек, используемых вместе. Создать свой набор можно командой cargo bp new battery-pack, она разворачивает готовый шаблон.

«Батарейки», не только зависимости, но и шаблоны («recipes»): например, CI battery pack (идею предложила и реализовала Джесс Айзен) через cargo bp add ci добавляет в проект готовые конфигурации GitHub Actions; шаблонизатор построен на библиотеке minijinja.

Наборы можно структурировать: зависимости и шаблоны группируются по категориям с правилом «выбрать не больше одного» или «выбрать сколько угодно». В демонстрационном наборе для embedded-разработки (cargo bp add embedded) интерактивный интерфейс в терминале показывает категории вроде «Concurrency Framework» (выбор одного варианта, embassy или rtic), «Display & Graphics», «Popular Drivers» и «Hardware Abstraction Layer» (выбор среди HAL для ATSAMD, ESP32/ESP32-C3/ESP32-S3, nRF52832/52840/9160, RP2040, STM32F0 и других плат).

Автор видит в battery packs способ решить ещё несколько задач экосистемы. Рабочие группы Rust Commercial Network (RCN) могли бы публиковать официальные наборы под свои нужды; вокруг наборов, спонсируемых RCN, предлагается создавать «фонды экосистемы», компании и частные лица платят за ранний доступ к патчам и уведомлениям об уязвимостях, а деньги идут мейнтейнерам используемых crates на разработку недостающих возможностей. Ещё один сценарий, стандартизация взаимодействия: рабочая группа по сетевым сервисам, по словам автора, уже столкнулась с тем, что часть крупных компаний использует не tokio, а собственные асинхронные рантаймы, и каждому crate приходится реализовывать свой набор трейтов для совместимости; спонсируемые battery packs предлагаются как нейтральная площадка для таких договорённостей.

Главным риском автор называет расползание: если публиковать наборы может кто угодно, их появится слишком много, и это никому не поможет. Он не считает это критичным, ожидает, что сложится небольшое число очевидных отправных наборов, а по мере роста опыта пользователи сами начнут искать более нишевые варианты. Отдельно разбирается риск застоя: набор не должен закостенеть на устаревшем выборе, когда на смену популярной библиотеке приходит более удачная альтернатива. В качестве примера такой эволюции приводится история парсинга аргументов командной строки в Rust: сначала был популярен docopt, затем его вытеснил более структурированный clap, а после появления structopt (автовывод парсера из структуры данных) эта возможность стала стандартной частью самого clap. Автор объясняет, что battery pack, «тонкая абстракция»: проект зависит не от самого набора, а от входящих в него crates, поэтому смена рекомендаций в новой версии набора не ломает уже написанный код, а любой желающий может выпустить альтернативный набор вокруг нового подхода.

Автор связывает battery packs с общим принципом дизайна Rust, «всегда делай ставку на экосистему» (маленькая стандартная библиотека и пакетный менеджер вместо всего в языке). По его словам, экосистема crates.io достигла стадии, когда новичкам не хватает «слоя негласного знания» о том, какие библиотеки выбрать; battery packs претендуют на роль недостающего слоя структуры, но автор допускает, что в итоге сообщество может прийти к другому решению той же проблемы.

Ключевые факты

  • Battery pack, курируемый набор crates под тему (CLI, backend, embedded, обработка ошибок); технически это обычный crate вида X-battery-pack, чьи зависимости и есть рекомендации
  • Выпущен рабочий прототип: cargo install cargo-bp, затем cargo bp list / cargo bp add cli / cargo bp add embedded (набор для embedded основан на репозитории Awesome Embedded Rust)
  • Наборы включают не только зависимости, но и шаблоны-«рецепты», например, CI battery pack добавляет готовые GitHub Actions через cargo bp add ci
  • Предлагается модель финансирования через Rust Commercial Network: официальные наборы от рабочих групп и «фонды экосистемы» для оплаты работы мейнтейнеров используемых crates
  • Главные риски, расползание из-за открытой публикации кем угодно и застой на устаревшем выборе; от застоя защищает «тонкая абстракция» (зависимость от crates, а не от самого набора), пример, эволюция docopt → clap → structopt

Почему это важно

Идея закрывает конкретную и часто называемую боль новичков в Rust: на crates.io много качественных, но конкурирующих между собой библиотек, и сравнение вариантов отнимает время ещё до начала работы над проектом. Battery pack даёт готовый набор рекомендаций по умолчанию, при этом не создавая жёсткой зависимости от него, набор можно всегда частично или полностью заменить. Это не просто предложение, а рабочий инструмент с опубликованными командами.

Кому это важно

В первую очередь, разработчикам на Rust, особенно новичкам, выбирающим библиотеки для CLI-приложений, backend-сервисов и embedded-проектов. Также, рабочим группам Rust Commercial Network и мейнтейнерам популярных crates: автор предлагает через спонсируемые battery packs выстроить модель финансирования их работы. Отдельно интересно командам, столкнувшимся с несовместимостью асинхронных рантаймов (tokio против собственных решений).

Как это применить

Установить прототип: cargo install cargo-bp. Посмотреть доступные наборы: cargo bp list. Добавить типовые библиотеки для CLI: cargo bp add cli; для embedded-проекта, cargo bp add embedded (интерактивный выбор HAL, драйверов дисплеев и датчиков, framework для конкурентности). Готовые GitHub Actions для CI: cargo bp add ci. Чтобы опубликовать собственный набор, используется шаблон: cargo bp new battery-pack, команда создаёт crate вида X-battery-pack, где зависимости и features описывают рекомендации.

Можно ли доверять

Материал, авторский технический пост в личном блоге, тесно связанном с командой разработки Rust и обсуждениями внутри Rust Commercial Network и Rust Vision Doc, а не маркетинговый анонс продукта. Заявленный прототип не абстрактен: приведены конкретные команды, названия crates и пример интерактивного интерфейса выбора для embedded-набора. Автор сам разбирает слабые места идеи (риск расползания наборов, риск застоя), что характерно для честного технического поста, а не рекламы.

Риски и подводные камни

Открытая публикация наборов кем угодно может привести к их избыточному количеству без реальной пользы для новичков, автор считает риск невысоким, рассчитывая, что естественным образом выделится несколько заметных отправных наборов. Есть риск застоя: набор может законсервировать устаревший выбор библиотек, когда на рынке уже есть более удачная альтернатива; смягчается тем, что проект технически зависит не от самого набора, а от входящих в него crates, поэтому смена рекомендаций в наборе не ломает существующий код. Модель финансирования через Rust Commercial Network и «фонды экосистемы», пока предложение, а не работающий механизм.

«Всегда делай ставку на экосистему, я считаю это ключевой аксиомой дизайна Rust. Именно поэтому мы выбрали маленькую стандартную библиотеку и пакетный менеджер, и именно поэтому battery packs задуманы так, чтобы их мог публиковать кто угодно.»

— автор блога smallcultfollowing.com