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

ROSARIUM

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

Практикум 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):

  1. Вы скачиваете все зависимости локально (go mod vendor)
  2. Создаёте архив vendor.tar.xz
  3. Включаете его как дополнительный Source в SPEC
  4. При сборке указываете 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-пакета.

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

  1. Подготовка и vendoring — подготовка окружения, скачивание исходников, vendoring зависимостей, изучение встраивания версии
  2. SPEC-файл и сборка — создание SPEC-файла, сборка пакета и проверка результатов
  3. Дополнительные темы — shell-completions, Go module proxy и воспроизводимость, структура файлов
  4. Ошибки и отладка — типичные ошибки новичков, полезные команды для отладки Go-сборки, итоги