Практикум 8: Go-приложение (lazygit)
Упаковка lazygit — терминального UI для Git, написанного на Go, с vendoring зависимостей.
В этом практикуме мы упакуем lazygit — популярный терминальный интерфейс для Git, написанный на Go. Это отличный пример для изучения особенностей упаковки Go-приложений: статическая линковка, vendoring модулей, встраивание версии через ldflags.
Что вы узнаете
- Почему Go-приложения требуют vendoring зависимостей для сборки в RPM
- Как подготовить vendor-архив
- Как собрать Go-проект с правильными флагами
- Как встроить информацию о версии в бинарник через
-ldflags - Почему Go-бинарники статические и что это значит для пакета
- Как обработать shell-completions (bash, zsh, fish)
Особенности упаковки Go-приложений
Go-приложения принципиально отличаются от C/C++/Rust в контексте RPM:
| Особенность | Что это значит для пакетирования |
|---|---|
| Статическая линковка | Бинарник самодостаточен, не нужны .so-файлы и ldconfig |
| Go-модули | Зависимости скачиваются из интернета при go build |
| Нет сети при сборке | На ABF (и в mock) нет доступа к интернету – нужен vendoring |
| Архитектурно-зависимый | Несмотря на один язык, бинарник компилируется под конкретную архитектуру (x86_64, aarch64…) |
| Большой бинарник | Go включает runtime и все зависимости в один файл – размер от 10 до 50+ МБ |
Почему vendoring обязателен
Go-модули по умолчанию скачиваются из сети (из прокси proxy.golang.org или напрямую
с GitHub). Но при сборке RPM на ABF сети нет. Это та же ситуация, что и с Rust (Cargo):
- Вы скачиваете все зависимости локально (
go mod vendor) - Создаёте архив
vendor.tar.xz - Включаете его как дополнительный Source в SPEC
- При сборке указываете Go использовать локальный vendor:
-mod=vendor
Без этого Go попытается обратиться к сети и упадёт:
go: github.com/jesseduffield/gocui@v0.3.0: Get "https://proxy.golang.org/...": dial tcp: lookup proxy.golang.org: no such host
О проекте lazygit
lazygit (GitHub) – терминальный UI для Git. Позволяет коммитить, ребейзить, управлять ветками и stash через интерактивный интерфейс. Один бинарник, без конфигов и библиотек – идеальный кандидат для первого Go-пакета.
Содержание практикума
- Подготовка и vendoring — подготовка окружения, скачивание исходников, vendoring зависимостей, изучение встраивания версии
- SPEC-файл и сборка — создание SPEC-файла, сборка пакета и проверка результатов
- Дополнительные темы — shell-completions, Go module proxy и воспроизводимость, структура файлов
- Ошибки и отладка — типичные ошибки новичков, полезные команды для отладки Go-сборки, итоги