go run main.go изменяет модуль go на более старую версию

#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