Как указать зависимость модуля Go в go.mod на последний коммит в репо?


104

Начиная с v1.11 Go добавлена ​​поддержка модулей. Команды

go mod init <package name>
go build

будет генерировать go.modи go.sumфайлы , которые содержат все версии найдены для зависимостей пакета.

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

Однако иногда мне может понадобиться функциональность, которой еще нет в опубликованном выпуске, а из коммита, сделанного после этого выпуска. Как настроить go.modуказание не на выпуск модуля, а на конкретную фиксацию в репозитории модуля?

Похоже, я могу сделать это вручную в go.mod с

module /my/module

require (
...
github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe
...
)

где v0.0.0не соответствует последнему опубликованному тегу выпуска, 20181121201909будет ли это отметка времени фиксации и af044c0995feбудет хеш фиксации? Следует ли такую ​​информацию искать и вводить вручную или есть способ лучше?

Ответы:


158

Просто найдите нужный хеш фиксации:

go get github.com/someone/some_module@af044c0995fe

'go get' правильно обновит файлы зависимостей (go.mod, go.sum).

Дополнительная информация: https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies


4
В случае получения ошибки « неизвестная ревизия » или « неверная версия » - убедитесь, что вы не указали хеш PR (pull request). Даже объединенный PR может быть неправильным. Ищите хеш фиксации в репозитории ниже /commits, но не ниже /pulls. Подробнее см. Здесь: golang / go # 31191 явно отфильтровывает такие коммиты.
Ноам Манос

1
ОП спрашивает, как добавить его в файл go.mod, а не как это сделатьgo get
Нулик

2
@Nulik go get- это правильный способ обновления / добавления go.modв соответствии с запросом OP.
Дэйв К.

94

Помимо ответа от Эвертона об использовании go get github.com/someone/some_module@af044c0995feдля получения конкретной фиксации, вы также можете использовать такие имена веток, как:

  • go get github.com/someone/some_module@master
  • go get github.com/someone/some_module@dev_branch

Эти примеры получают последнюю фиксацию в соответствующей ветке.

Он по-прежнему будет записан в вашем файле как псевдо-версияgo.mod , например v0.0.0-20171006230638-a6e239ea1c69. (Это помогает обеспечить простой общий порядок для всех версий на основе стандартного порядка семверов ).


9
спасибо за объяснение псевдоверсии. Я пытался replaceиспользовать временную вилку какой-то зависимости, но не смог найти способ сделать эту замену, чтобы указать на некоторую фиксацию. Пришлось создать тег версии и указать его вот так replace github.com/original/somelib => github.com/fork/somelib v1.2.3, что слишком много, когда я просто хочу быстро протестировать материал. replace github.com/original/somelib => github.com/fork/somelib@commithashи replace github.com/original/somelib => github.com/fork/somelib commithashне работают
Жандос

6

Я уже некоторое время бью головой о том, как это работает для всех, и я не могу его запустить. Для меня я должен был выполнить фиксацию в основной ветке, только тогда я смог ее получить.

Чтобы перейти к работе с определенной веткой, идентификатором фиксации или тегом, вам необходимо включить флаг для модуля go, выполнив команду ниже

перейти env -w GO111MODULE = on

после этого мы сможем сделать

go get repo@branchname
go get repo@tag
go get repo@commithash

2

Если вы хотите временно заменить зависимость на локальный каталог (например, если вы работаете над двумя модулями одновременно), вы можете добавить replaceоператор в конец go.modфайла:

module example.com/mypkg

go 1.15

require (
  gitlab.com/someone/a_package v0.14.2
)

replace gitlab.com/someone/a_package => ../my_forks/a_package

0

Также, если вы поместите слово latest вместо тега в файле go.mod, оно будет изменено на последний тег модулей.

Например:

module /my/module

require (
...
github.com/someone/some_module latest
...
)

станет

module /my/module

require (
...
github.com/someone/some_module v2.0.39
...
)

после бега go mod tidy

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.