EnglishРусский Map

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