Як зробити “go get” на певному тезі сховища github


89

Я намагаюся скомпілювати базу даних InfluxDB (версія v0.8.8) за допомогою go get github.com/influxdb/influxdb

Але це тягне головну гілку, і мені потрібен v0.8.8тег.

Я намагався це зробити: go get github.com/influxdb/influxdb/releases/tag/v0.8.8але це не вдається сказати не вдається знайти.

Я також намагався зробити регулярний go getмайстер гілки, а потім перевіряти вручну з тега , використовуючи gitв GOPATH/src/github...для того , щоб встановити Corret версію.

Проблема використання останнього підходу полягає в тому, що коли я намагаюся витягнути залежності, go get -u -f ./...він намагається знайти їх у гілці master, а деякі з них не існують у гілці master ...

TL; DR : виконайте go getпевний тег github і витягніть правильні залежності.


Спробуйте це .. git tag -a v0.8.8 - "Ваш коментар"
Ашок Лондхе

2
@AshokLondhe Він запитує, як використовувати тег go get, а не як його створити.
wonderb0lt

@ wonderb0lt це команда для додавання тегу.
Ашок Лонде

Думаю, я спробував з’ясувати, як перевірити і конкретний тег, і востаннє намагався, це було неможливо ...
wonderb0lt

1
Погляньте на це . Ближче до кінця слайди пропонують деякі альтернативи управління залежністю.
wonderb0lt

Відповіді:


34

Використовувати go getінструмент неможливо . Натомість вам потрібно використовувати сторонній інструмент управління пакетами go або створити власні форки для пакетів, якими ви хочете керувати більш дрібнозернистими.

Розмовляючи з хлопцем, який працює в Google, і він визнав цю проблему / вимогу, він сказав, що продажі, які використовувала його команда, були громіздкими, і вони, ймовірно, незабаром вирішать це за допомогою офіційних інструментів.

Детальніше:

Продаж у Go 1.6

Продаж випущений з експериментальної версії go 1.6 (після того, як ця публікація була спочатку написана), що полегшує процес використання конкретних тегів / версій пакетів із використанням сторонніх інструментів. go getвсе ще не має функцій для отримання певних тегів або версій.

Детальніше про те, як працює постачальник : Розуміння та використання папки постачальника

Модулі в Go 1.11

Go 1.11 випустив експериментальну функцію, яка називається модулями для вдосконалення управління залежностями, і вони сподіваються випустити її стабільною в Go 1.12: Інформація про модулі в Go 1.11


1
Чи можете ви докладніше розповісти про частину Google? Це велике обговорення в списку розсилки спільноти go, чи є якийсь інший напрямок, який там не обговорювався?
Not_a_Golfer

1
@Not_a_Golfer Це був хлопець, який не входив до команди Go, але говорив про те, що в даний час вони використовують внутрішню торгівлю і що це було досить громіздко. Тож вони були зацікавлені вирішити це краще за допомогою офіційних інструментів. Подумайте, що це була неофіційна заява, але це зробить це більш чітким.
Робін Андерссон,

2
AFAIK, єдина пропозиція - офіційний формат файлу постачальника / залежності. Це все ще чудово, оскільки проекти не можуть бути прив’язані до інструменту залежностей і можуть взаємодіяти з будь-яким рішенням, яке вони хочуть (тобто я віддаю перевагу блокуванню версій, тоді як інші надають перевагу продаванню).
JimB

модулі насправді не мають справи із залежністю від компіляторів коду, що змушує нас використовувати go get protoc-gen-go десь ще з версією виправлення. Таким чином, ми постійно потребуємо відстеження однакових версій у двох різних місцях (адже бібліотеки тісно пов’язані з генератором)
Мартін Косіцький,

24

go mod доступний зараз.

Для тих, кому потрібно створити двійковий файл певного тегу , ось мій спосіб:

mkdir temp
cd temp
go mod init .
go get -d -v github.com/nsqio/nsq@v1.1.0
mkdir bin
go build -o bin/nsqd.exe github.com/nsqio/nsq/apps/nsqd

Пояснення:

  • Наведений вище код витягує NSQ v1.1.0 і збирає nsqd.
  • go mod init .створює go.modфайл у поточному каталозі, що дозволяє використовувати go getз версією / тегами. (див. це посилання )
  • -d означає "лише завантажити", якщо ви хочете безпосередньо встановити, опустіть цей прапор і команди збірки під цим рядком.
  • -v означає "бути багатослівним".
  • Наведений вище код призначений для Windows. Якщо ви використовуєте Linux, замініть bin/nsqd.exeна bin/nsqd.

Завантажений модуль зберігається в %GOPATH%\pkg\mod. Якщо ви не хочете забруднювати свій GOPATHкаталог, створіть новий і налаштуйте його GOPATHна нього.


4
У go 1.13 go mod initпотрібен ідентифікатор модуля, наприкладgo mod init local/build
archie

11

Я мав успіх у цьому:

  • Запустіть команду get без тегу - вона повинна клонувати головну гілку.
  • Перейдіть до каталогу клонування та перевірте потрібний тег або гілку.
  • Знову запустіть команду go get, вона повинна обробити команду на зареєстрованій гілці.

4
Під час першого запуску ви можете go get -d <git-url>просто завантажити пакети та пропустити встановлення.
webwurst

Це те, що слід використовувати, коли вам потрібен певний тег, gopkg.in занадто обмежує.
Хришикеш Кумар,

3

Це питання передує модулям Go, але для подальших посилань правильна процедура в Go 1.11 для отримання конкретної версії така:

go get github.com/influxdb@[version]

Або отримати конкретний тег git:

go get github.com/influxdb@[gitref]


1

У мене є (дещо хакерський, але робочий) підхід до вирішення цієї проблеми, принаймні для сховищ git: Оскільки пакети go get'ed - це звичайні сховища керування джерелом, можна перевірити теги за допомогою звичайних інструментів git (можна використовувати git із командного рядка , Я використовую Atlassian SourceTree).

Щоб поділитися конфігурацією пакета зі своїми товаришами по команді, я створив сховище git з мого GOPATH . Потім я додав усі пакети (принаймні ті, якими я хотів керувати таким чином) до цього репо як підмодуль git. Це вимагає від вас зсунути існуючі папки репо та знов додати їх як підмодуль git, щоб не плутати git. Цей процес є дещо нудним, але виявився вартим клопоту:

Тепер я можу зробити коміт і натиснути на моє репо GOPATH щоразу, коли я використовую новий пакет go. Коли мої товариші по команді витягують з цього репо і видають оновлення підмодуля git (або просто оновлюють через SoureTree, що робить це автоматично), їх версія пакету перевіряється на тому самому тезі, що і мій.

Звичайно, це працює лише для пакетів під контролем джерела git ...


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.