gomodup — это CLI инструмент на Go, который помогает поддерживать ваши зависимости Go в актуальном состоянии. Он
сканирует ваш файл go.mod, находит устаревшие пакеты, а затем интеллектуально определяет самые свежие совместимые
версии с вашей текущей версией Go, чтобы избежать проблем с совместимостью.
В мире Go, где зависимости развиваются быстро, иногда бывает сложно понять, на какую версию можно безопасно обновиться,
не сломав сборку или не потребовав обновления вашей версии Go. gomodup решает эту проблему, делая следующее:
- Читает
go.mod: Идентифицирует все прямые зависимости. - Проверяет актуальность: Обращается к прокси Go-модулей (
proxy.golang.org) для получения всех доступных версий каждого модуля. - Проверяет совместимость с Go: Для каждой новой версии модуля скачивает её
go.modи проверяет, какая версия Go требуется для этого модуля. - Фильтрация по версии Go: Если новая версия модуля требует Go выше вашей текущей (например, у вас Go 1.23, а
модуль требует 1.24),
gomodupостановится и предложит самую последнюю версию, совместимую с вашей версией Go. - Игнорирование приватных модулей: Уважает переменную окружения
GOPRIVATE, пропуская модули, к которым нет публичного доступа. - Параллельная обработка с Rate Limiting: Использует горутины для быстрой проверки множества модулей, но с настраиваемыми задержками для предотвращения перегрузки реестра пакетов.
- Удобный вывод: Представляет список найденных совместимых версий в виде таблицы и генерирует команды
go getдля простого обновления.
Больше никаких ручных проверок и головной боли! Просто запустите gomodup и получите список готовых команд. (づ。◕‿‿◕。)づ
Для установки gomodup, убедитесь, что у вас установлен Go 1.25+ и выполните команду:
go install github.com/AdamBrianBright/gomodup@latestПосле этого исполняемый файл gomodup будет доступен в вашем $GOPATH/bin.
Перейдите в корневую директорию вашего проекта Go, где находится go.mod, и запустите:
gomodupgomodup -vЕсли ваш файл go.mod находится не в текущей директории:
gomodup -dir /path/to/your/go/projectgomodup поддерживает конфигурацию через переменные окружения, что позволяет точно настроить его поведение:
| Переменная окружения | Описание | Значение по умолчанию |
|---|---|---|
REQUEST_TIMEOUT |
Таймаут для каждого отдельного HTTP-запроса к прокси Go-модулей (например, 10s, 1m). |
30s |
GLOBAL_TIMEOUT |
Общий таймаут для выполнения всей программы. Если превышен, программа завершится (например, 5m, 30m). |
5m |
MAX_CONCURRENCY |
Максимальное количество одновременных горутин для проверки модулей. Контролирует параллелизм. | 5 |
RATE_LIMIT |
Задержка между запросами к прокси Go-модулей. Помогает избежать блокировки и "DDoS-атаки" на сервис (например, 100ms, 1s). |
100ms |
SKIP_INDIRECT |
Если установлено в true, косвенные зависимости будут пропущены. Если false, они также будут проверены на обновления. |
true |
GOPRIVATE |
Список приватных репозиториев, разделенных запятыми, которые не должны проверяться. Соответствует поведению go get. Использует глоб-паттерны (например, *.corp.com, github.com/myorg/*). |
(пусто) |
Пример использования переменных окружения:
REQUEST_TIMEOUT=60s MAX_CONCURRENCY=10 RATE_LIMIT=50ms GOPRIVATE="git.mycompany.com/*,github.com/myuser/private-repo" gomodup -vНайденные совместимые версии:
| Модуль | Совместимые версии |
|----------------------------|----------------------------------------|
| github.com/gin-gonic/gin | v1.9.2, v1.9.3, v1.10.0 |
| github.com/stretchr/testify| v1.8.5, v1.9.0 |
Предлагаемые обновления:
go get github.com/gin-gonic/gin@v1.10.0
go get github.com/stretchr/testify@v1.9.0
Если обновлений не найдено:
Совместимые обновления не найдены.
Проект организован по пакетам для лучшей читаемости и поддерживаемости:
gomodup/
├── main.go # Точка входа в приложение
├── config/ # Загрузка и управление конфигурацией
├── version/ # Парсинг и сравнение семантических версий
├── module/ # Логика обработки Go-модулей и зависимостей
├── fetcher/ # HTTP-клиент с Rate Limiting для получения данных
├── parser/ # Парсинг файла go.mod
└── table/ # Форматирование и вывод таблиц
Этот проект распространяется под лицензией MIT. Подробнее смотрите файл LICENSE.
Сделано с ❤️ на Go.