Как изменить путь к модулям Go?

У меня есть репозиторий github github.com/user/somerepo.

Я инициализирую его, выполнив go mod init **github.com/user/somerepo**

Мне нужно изменить эту зависимость и указать на другой репозиторий github. Скажем: github.com/user/a-different-repo.

Есть ли какая-нибудь команда go, которая может обновить все операторы импорта во всех файлах?


person Aryan Ahmed Anik    schedule 07.06.2020    source источник


Ответы (1)


go mod edit -replace - ваш друг в этом.

Из документа (Источник):

Флаг -replace = old [@v] = new [@v] добавляет замену указанной пары пути и версии модуля. Если @v в старом @ v опущен, добавляется замена без версии слева,

Вот важная часть:

который применяется ко всем версиям старого пути к модулю. Если @v в new @ v опущен, новый путь должен быть корневым каталогом локального модуля, а не путем к модулю. Обратите внимание, что -replace отменяет любые избыточные замены для старого [@v], поэтому отсутствие @v приведет к удалению существующих замен для определенных версий.

Вот AddReplace func, который отвечает за замену.

Теперь, чтобы добиться этого, каждый ваш репозиторий должен быть сопоставлен с вашим GOPATH. Небольшой отзыв о GOPATH:

Если вы хотите, чтобы репозиторий стал пакетом «go gettable», вы должны сопоставить этот репозиторий со своим GOPATH.

Как описано здесь, когда вы делаете go get, он сначала ищет в вашем $GOPATH и принимает последнюю версию пакета (или конкретную версию, если вы указали ее в файле go.mod)

Затем вы можете внести изменения, выполнив эту команду:

go mod edit -replace github.com/UserA/[email protected]=github.com/UserA/[email protected]

Другой способ (и, возможно, лучший) - сделать это внутри файла go.mod, например:

  module foo.bar                        

  replace github.com/UserA/foo => github.com/UserA/bar

  require (   
  github.com/UserA/foo v0.0.1
 )   

Конечно, это будет работать, только если каждый репозиторий сопоставлен с вашим GOPATH.

См. Также здесь для дальнейшего объяснения: когда -should-i-use-the-replace-directive

person jossefaz    schedule 07.06.2020
comment
Я пробовал это, но в ответ получаю : новый неверсированный путь должен быть локальным каталогом. - person Aryan Ahmed Anik; 07.06.2020
comment
Как вы управляете своим гопатом? Вы вытащили репозиторий в свой локальный файловый каталог? - person jossefaz; 07.06.2020
comment
@prophecy: я обновляю свой ответ, объясняя, как этого добиться .... убедитесь, что ваш репозиторий сопоставлен с GOPATH - person jossefaz; 07.06.2020