Начиная с 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
будет хеш фиксации? Следует ли такую информацию искать и вводить вручную или есть способ лучше?
/commits
, но не ниже/pulls
. Подробнее см. Здесь: golang / go # 31191 явно отфильтровывает такие коммиты.go get
go get
- это правильный способ обновления / добавленияgo.mod
в соответствии с запросом OP.Помимо ответа от Эвертона об использовании
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
. (Это помогает обеспечить простой общий порядок для всех версий на основе стандартного порядка семверов ).источник
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
не работаютЯ уже некоторое время бью головой о том, как это работает для всех, и я не могу его запустить. Для меня я должен был выполнить фиксацию в основной ветке, только тогда я смог ее получить.
Чтобы перейти к работе с определенной веткой, идентификатором фиксации или тегом, вам необходимо включить флаг для модуля go, выполнив команду ниже
после этого мы сможем сделать
go get repo@branchname go get repo@tag go get repo@commithash
источник
Если вы хотите временно заменить зависимость на локальный каталог (например, если вы работаете над двумя модулями одновременно), вы можете добавить
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
источник
Также, если вы поместите слово latest вместо тега в файле go.mod, оно будет изменено на последний тег модулей.
Например:
станет
module /my/module require ( ... github.com/someone/some_module v2.0.39 ... )
после бега
go mod tidy
источник