Як вказати залежність модуля Go в go.mod до останнього коміту в репо?


111

Починаючи з v1.11 Go, додана підтримка модулів. Команди

go mod init <package name>
go build

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

Якщо модуль не має жодних випусків, використовується останній коміт цього модуля. Якщо модуль має випуски, останній вибирається як залежність.

Однак іноді мені потрібна функціональність, яка ще не в опублікованому випуску, а з коміту, зробленого після цього випуску. Як встановити go.modвказівку не на випуск модуля, а на певний коміт у сховищі модуля?

Схоже, я можу зробити це вручну в go.mod with

module /my/module

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

де v0.0.0не відповідає останньому опублікованому тегу випуску, 20181121201909буде міткою часу фіксації та af044c0995feбуде хешем коміту? Чи слід таку інформацію знаходити та вводити вручну, чи є кращий спосіб?

Відповіді:


171

Просто "йди отримуй" у потрібний хеш коміту:

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 (витяг запиту). Навіть об’єднаний PR може бути помилковим. Шукайте хеш коміту в репо під /commits, але не під /pulls. Детальніше див. Тут: golang / go # 31191 явно відфільтровує такі види комітів .
Ноам Манос,

1
ОП askes , як додати його в go.mod файл, а не як зробитиgo get
Nulik

2
@Nulik go get- це правильний спосіб оновлення / доповнення go.modспособом, яким просив ОП.
Dave C

95

На додаток до відповіді від Everton щодо використання 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. (Це допомагає забезпечити просте загальне впорядкування у всіх версіях на основі стандартного замовлення Semver ).


10
дякую за пояснення псевдоверсії. я намагався зробити a, 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не працюють
Жандос Жилкайдар

8

Я певний час бився головою, що це працює для всіх, і я не можу цим керувати. Для мене я повинен був взяти на себе зобов'язання освоїти гілку, тоді лише я зміг її отримати.

Щоб перейти до роботи з конкретною гілкою, ідентифікувати коміт або тег, потрібно ввімкнути прапор для модуля go, запустивши команду нижче

go env -w GO111MODULE = увімкнено

після цього ми зможемо це зробити

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

3

Якщо ви хочете тимчасово підставити залежність у локальний каталог (наприклад, якщо ви працюєте над 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

2

Крім того, якщо ви помістите слово останній замість тегу у файл 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.