05 марта 2026 № 1 (2026)

ROSARIUM

газета советского программиста

Практикум 2: Rust CLI-утилита (ripgrep)

Упаковка ripgrep (rg): Rust CLI с vendoring зависимостей.

В этом практикуме упакуем ripgrep (rg) — быструю утилиту поиска по файлам, написанную на Rust. Это хороший пример, потому что Rust-пакеты требуют особого подхода: vendoring зависимостей. Мы подробно разберем, зачем это нужно и как это работает.

Что вы узнаете

  • Зачем и как делать vendoring зависимостей Cargo
  • Как собрать Rust-проект полностью офлайн (это критично для ABF)
  • Как описать опциональные фичи через %bcond
  • Как найти, какие бинарники создает Rust-проект
  • Как проверить корректность собранного бинарника

О проекте

ripgrep — популярная утилита для рекурсивного поиска по файлам с поддержкой регулярных выражений. Она быстрее grep и ack, умеет пропускать скрытые файлы и файлы из .gitignore. Написана на Rust и использует систему сборки Cargo.

Почему нужен vendoring

Это ключевой момент для понимания всего практикума.

Cargo (менеджер пакетов Rust) по умолчанию скачивает зависимости из реестра crates.io при каждой сборке. Типичный Rust-проект может иметь десятки или сотни зависимостей.

Проблема: при сборке на ABF (Automated Build Farm) у вас нет доступа к интернету. Сборочная среда изолирована. Это значит, что Cargo не сможет скачать зависимости, и сборка упадет с ошибкой:

error: failed to download `aho-corasick v1.1.2`

Caused by:
  [6] Could not resolve host: crates.io

Решение — vendoring: мы заранее скачиваем все зависимости в каталог vendor/, упаковываем его в отдельный архив и кладем рядом с исходниками как Source1. При сборке Cargo будет брать зависимости из этого локального каталога, а не из интернета.

Схема:

Source0: исходный код ripgrep (из GitHub)
Source1: vendor.tar.xz (все зависимости Cargo, скачанные заранее)

Содержание практикума