ultimate-gojust
- title
- ultimate-gojust
- type
- toolbox
- summary
- Готовый Justfile для сборки, кросс-компиляции, линтинга, hot reload и миграций БД в Go-проектах
- tags
- golang, build-automation, just
- language
- Just
- license
- MIT
- created
- 2026-04-07
- updated
- 2026-04-07
- lang
- ru
- translation_of
- ultimate-gojust
- source_updated
- 2026-04-07
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Готовый Justfile, покрывающий полный жизненный цикл Go-проекта: генерацию каркаса проекта, сборку с внедрением версии, кросс-компиляцию, тестирование с покрытием, линтинг, сканирование уязвимостей, hot reload, Docker и миграции базы данных. Это аналог ultimate-gomake на базе just (тот же автор, те же возможности, другой исполнитель).
Как устроен
Justfile представляет собой один файл, который вы копируете в корень проекта. Он использует функцию env_var_or_default() из just для каскадной настройки: аргументы CLI переопределяют переменные окружения, те переопределяют значения из файла .env, а те - зашитые по умолчанию значения. Это позволяет запускать just GOOS=darwin build без каких-либо правок в файле.
Внедрение версии
Рецепт сборки автоматически извлекает информацию о версии из git и передаёт её через ldflags:
version := `git describe --tags --always --dirty 2>/dev/null || echo "dev"`
git_commit := `git rev-parse --short HEAD 2>/dev/null || echo "unknown"`
ld_flags := "-s -w \
-X '$(go list -m)/pkg/version.Version=" + version + "' \
-X '$(go list -m)/pkg/version.Commit=" + git_commit + "' \
-X '$(go list -m)/pkg/version.Branch=" + git_branch + "' \
-X '$(go list -m)/pkg/version.BuildTime=" + build_time + "' \
-X '$(go list -m)/pkg/version.BuildBy=" + build_by + "'"
Для этого требуется пакет pkg/version с экспортированными строковыми переменными. Флаги -s -w вырезают отладочную информацию и таблицы DWARF для уменьшения размера бинарников.
Кросс-компиляция
Рецепт build-all перебирает семь комбинаций ОС и архитектур (linux amd64/arm64/armv7, darwin amd64/arm64, windows amd64/arm64), собирает статические бинарники с CGO_ENABLED=0 и упаковывает каждый результат в tar-архив. К сборкам под Windows автоматически добавляется суффикс .exe.
Инструменты разработки
just deps устанавливает golangci-lint, gofumpt, govulncheck, mockgen и Air (инструмент для hot reload). just dev скачивает конфигурационный файл Air при его отсутствии и начинает отслеживать изменения. just lint запускает golangci-lint с флагом --fix. just security запускает govulncheck.
Миграции базы данных
Используется golang-migrate с поддержкой PostgreSQL и MySQL. just db-migrate накатывает ожидающие миграции, just db-rollback откатывает один шаг, just db-reset удаляет всё. Все команды считывают DATABASE_URL из переменных окружения.
Соглашение о точке входа
Репозиторий предполагает, что точкой входа для сборки служит main/main.go. Это нестандартно: в Go принято использовать структуру cmd/<name>/main.go для проектов с одним или несколькими бинарниками. Для структуры с cmd/ рецепт сборки придётся подкорректировать:
build:
mkdir -p {{bin_dir}}
{{go}} build \
-ldflags '{{ld_flags}}' \
-o {{bin_dir}}/{{project_name}} \
./cmd/{{project_name}}
Для проектов с несколькими бинарниками понадобится цикл по каталогам внутри cmd/.
Интересные приёмы
Наиболее полезные части, которые можно переиспользовать в любом Go Justfile'е:
- Внедрение версии через ldflags - проброс метаданных git в бинарники во время компиляции без необходимости кодогенерации
- Каскадная конфигурация через
env_var_or_default()- позволяет использовать один и тот же Justfile для локальной разработки, CI и продакшена без форков - Цикл кросс-компиляции - компактный способ собирать релизные бинарники под все платформы
- Закрепление инструментов через
go install ...@latestв рецептеdeps- держит команду на одном наборе инструментов
Ограничения
- Только один бинарник - нет встроенной поддержки структуры
cmd/с несколькими бинарниками - Версии инструментов зафиксированы на
@latest, а не на конкретных версиях, что может приводить к нестабильности в CI - Рецепт
initскачивает.gitignoreс gitignore.io (внешняя зависимость, которая может стать недоступной) - В репозитории нет эквивалента на Makefile (но
ultimate-gomakeдоступен отдельно)
49 звёзд, лицензия MIT. Репозиторий: https://github.com/binbandit/ultimate-gojust