Avatar ·

Как установить конкретную версию пакета Go с помощью go get?

Всем привет! Я новичок в Go и пытаюсь разобраться с управлением зависимостями. У меня есть проект, который использует библиотеку github.com/gorilla/mux. В последней версии (v1.8.0) произошли критические изменения, которые ломают мой код. Мне нужно установить именно версию v1.7.4, с которой всё работало стабильно. Я пробовал писать go get github.com/gorilla/mux@v1.7.4, но получаю ошибку: go: github.com/gorilla/mux@v1.7.4: invalid version: unknown revision v1.7.4. Пробовал также go get github.com/gorilla/mux v1.7.4 и go get github.com/gorilla/mux#v1.7.4 — тоже не работает. У меня Go 1.18, модули включены (GO111MODULE=on). Вот мой go.mod файл: module myapp go 1.18 require github.com/gorilla/mux v1.8.0 Я хочу заменить v1.8.0 на v1.7.4. Как правильно указать версию? Нужно ли сначала удалить текущую версию? Или есть специальный синтаксис для go get? Буду благодарен за подробное объяснение с примерами. Также интересно: как вообще узнать, какие версии пакета доступны? И что делать, если пакет использует семантическое версионирование с v2, v3 и т.д.? Слышал, что для таких случаев нужен другой подход. Заранее спасибо! <<>>

Правильный синтаксис go get для указания версии

В Go с включенными модулями (GO111MODULE=on) команда go get поддерживает суффикс @version для указания конкретной версии пакета. Ваша ошибка возникает, скорее всего, из-за того, что версия v1.7.4 не существует для пакета gorilla/mux (или вы допустили опечатку). Правильный синтаксис:

go get github.com/gorilla/mux@v1.7.4

Но перед этим нужно убедиться, что версия действительно существует. Для этого выполните:

go list -m -versions github.com/gorilla/mux

Эта команда покажет все опубликованные теги (версии) для пакета. Для gorilla/mux актуальные версии: v1.7.3 v1.7.4 v1.8.0 и т.д. Если версия v1.7.4 есть в списке, то команда сработает.

Пошаговая инструкция для замены версии

  1. Проверьте текущие версии в go.mod — откройте файл и посмотрите, какая версия указана.
  2. Выполните установку нужной версии:
    go get github.com/gorilla/mux@v1.7.4
    Эта команда автоматически обновит go.mod и скачает указанную версию в кеш.
  3. Проверьте изменения:
    cat go.mod
    Вы должны увидеть строку: require github.com/gorilla/mux v1.7.4
  4. Обновите go.sum — go get делает это автоматически, но для верности можно выполнить:
    go mod tidy
    Это удалит неиспользуемые зависимости и добавит недостающие хеши.

Что делать, если версия не найдена?

Возможные причины:

  • Версия не опубликована — используйте go list -m -versions чтобы проверить.
  • Пакет использует v2+ семантическое версионирование — для таких пакетов путь импорта меняется. Например, для github.com/gorilla/mux версии v2 путь будет:
    go get github.com/gorilla/mux/v2@v2.0.0
    Обратите внимание на /v2 в конце пути.
  • Используется псевдоверсия — если нужной версии нет в тегах, можно указать коммит:
    go get github.com/gorilla/mux@abc123def
    Где abc123def — хеш коммита (не менее 12 символов).

Пример полного цикла работы

// 1. Узнаём доступные версии
$ go list -m -versions github.com/gorilla/mux
github.com/gorilla/mux v1.7.3 v1.7.4 v1.8.0

// 2. Устанавливаем нужную
$ go get github.com/gorilla/mux@v1.7.4
go: added github.com/gorilla/mux v1.7.4

// 3. Проверяем go.mod
$ cat go.mod
module myapp
go 1.18
require github.com/gorilla/mux v1.7.4

// 4. Очищаем зависимости
$ go mod tidy

Важные моменты

  • Нет необходимости предварительно удалять старую версию — go get сам заменит её.
  • Если вы хотите вернуться к последней версии, выполните go get github.com/gorilla/mux@latest.
  • Для пакетов без тегов можно использовать @master или @main для получения последнего коммита в ветке.
  • Все изменения в go.mod и go.sum нужно коммитить в систему контроля версий.

Если после всех действий код всё ещё не компилируется, проверьте, не используете ли вы функции, которые были добавлены только в более новых версиях пакета.

<<>>

Альтернативный подход: редактирование go.mod вручную

Иногда проще не использовать go get, а напрямую отредактировать файл go.mod. Это особенно удобно, когда нужно зафиксировать несколько зависимостей одновременно или когда go get выдаёт неожиданные ошибки.

Шаги:

  1. Откройте go.mod в текстовом редакторе.
  2. Найдите строку с нужным пакетом, например:
    require github.com/gorilla/mux v1.8.0
  3. Измените версию вручную:
    require github.com/gorilla/mux v1.7.4
  4. Сохраните файл.
  5. Выполните в терминале:
    go mod download
    Эта команда скачает указанную версию и обновит go.sum.

Плюсы этого метода:

  • Полный контроль над содержимым go.mod.
  • Можно сразу изменить несколько пакетов.
  • Полезно, если go get ломает другие зависимости из-за неявных обновлений.

Минусы:

  • Нужно точно знать версию (используйте go list -m -versions).
  • Если версия указана неверно, go mod download выдаст ошибку.

Этот способ особенно рекомендуется, когда вы работаете в команде и хотите избежать автоматических изменений в зависимостях. После ручного редактирования всегда запускайте go mod tidy для синхронизации.