#go #go-modules
#Вперед #go-модули
Вопрос:
Я использую github.com/go-chi/jwtauth v1.2.0
, однако, как только я запускаю my main.go
my go.mod
, изменяется версия библиотеки github.com/go-chi/jwtauth v4.0.3 incompatible
, которая является более старой версией и не обладает нужной мне функциональностью. Я попытался изменить версию вручную в go.mod
файле, и библиотека обновляется для меня, однако, как только я запускаю команду go run main.go
, она возвращается к старой версии. Почему это могло произойти и как я мог решить эту проблему?
Спасибо.
Комментарии:
1. В общем, вы не должны использовать
go run
для этого, особенно с аргументами filename
Ответ №1:
Вы можете использовать -mod=readonly
, чтобы попросить Go tools не прикасаться к вашему go.mod
. На самом деле, это по умолчанию используется в Go 1.16, поэтому я рекомендую вам обновиться.
[FWIW, версия v4.0.3 звучит как более новая версия, чем v1.2.0]
Комментарии:
1. Вы имеете в виду , что я должен добавить -mod=readonly при запуске
go run main.go
? Потому что он все еще возвращается к старой версии. И да, я знаю, что название версии довольно странное, но версия v1.2.0 — самая новая версия 🙂2. @Marius Ты не должен использовать
go run
** вообще **. You should
go build -mod=только для чтения`.3. @Marius: можете ли вы привести минимальный, воспроизводимый пример? Самый маленький
main.go
иgo.mod
который демонстрирует вам проблему вместе с вашей версией Go
Ответ №2:
Причина этого в том, что автор модуля обновил модуль до официальной поддержки модулей Go (т. Е. go mod
). Чтобы сделать это и сохранить тот же URL-адрес, им пришлось установить версию модуля на 1.x
. Как следствие, go mod
думает, что 4.x
это позже, чем 1.x
когда на самом деле это не так (разумно думать, что большее число позже).
Некоторые авторы модулей создают новую версию, например , v5
, но это изменило бы URL-адрес, с которого извлекается модуль. Некоторые авторы согласны с этим, другие — нет.
В Go 1.16 есть возможность retract
использовать предыдущие версии модуля — это отметка в go.mod
файле, которая указывает go не использовать эту версию. Некоторые авторы могут сделать это вместо этого.
Надеюсь, это объясняет, почему и как меняются некоторые авторы модулей. В данном случае это не совсем решает вашу проблему, но -mod=readonly
работает.
FWIW, автор модуля уже создан v5.x
, поэтому эта проблема не будет существовать для этого конкретного модуля.
Ответ №3:
go mod tidy
гарантирует, что файл go.mod соответствует исходному коду в модуле. Он добавляет все недостающие требования к модулю, необходимые для сборки пакетов и зависимостей текущего модуля, и удаляет требования к модулям, которые не предоставляют никаких соответствующих пакетов. Он также добавляет все недостающие записи в go.sum и удаляет ненужные записи. Ссылка на модули Go