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

go mod init 
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 будет хешем фиксации? Следует ли такую ​​информацию искать и вводить вручную или есть способ лучше?

dimus

Ответов: 6

Ответы (6)

Просто «иди и возьми» хеш фиксации, который тебе нужен:

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

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

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

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

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

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

Также, если вы поместите слово 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
...
)

после запуска мод tidy

Если вы хотите временно заменить зависимость на локальный каталог (например, если вы работаете над двумя модулями одновременно), вы можете добавить оператор 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
  • Скачать исходник из ветки
    иди и получи your-repo@branch-name прочитать вывод с версией модуля go для добавления в require или replace:
    go: загрузка github.com/your-repo v1.2.3-0.20210609123456-123123123
  • Позже эту версию можно будет найти как строку вывода следующей команды
    go list -m -json your-repo@branch-name | jq '. | "\ (. Путь) \ (. Версия)"'
  • Если jq не установлен на вашем ПК - вручную объедините Path и Version значения результата из:
    go list -m -json your-repo@branch-name
    через пробел:
    ваш-репозиторий v1.2.3-0.20210609123456-123123123

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

  • зайдите на github.com/someone/some_module@master
  • перейдите на github.com/someone/some_module@dev_branch

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

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

2022 WebDevInsider