Как сделать "иди и получить" для определенного тега репозитория 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 ./...он пытается найти их в главной ветке, а некоторые из них не существуют в главной ветке ...

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

ESala
источник
Попробуйте это .. 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по-прежнему не имеет возможности получать определенные теги или версии.

Подробнее о том, как работает вендор: понимание и использование папки vendor

Модули в Go 1.11

Go 1.11 выпустил экспериментальные функции, называемые модулями, для улучшения управления зависимостями, они надеются выпустить их как стабильные в Go 1.12: Информация о модулях в Go 1.11

Робин Андерссон
источник
1
Не могли бы вы рассказать подробнее о Google? В списке рассылки сообщества идет большое обсуждение этого вопроса, есть ли какие-либо другие направления, которые там не обсуждались?
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его.

BRK
источник
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]

Emidander
источник
1

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

Чтобы поделиться конфигурацией моего пакета с товарищами по команде, я создал репозиторий git из моего GOPATH . Затем я добавил все пакеты (по крайней мере, те, которыми я хотел управлять таким образом) в это репо как подмодуль git. Это требует, чтобы вы переместили существующие папки репо в сторону и повторно добавили их как подмодуль git, чтобы не путать git. Этот процесс несколько утомительный, но он того стоит:

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

Конечно, это работает только для пакетов с системой контроля версий git ...

Питер Хоммель
источник