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