Практикум 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, скачанные заранее)