Como fazer "ir buscar" em uma tag específica de um repositório github

89

Estou tentando compilar o banco de dados InfluxDB (versão v0.8.8) usando go get github.com/influxdb/influxdb

Mas isso puxa o branch master e eu preciso da v0.8.8tag.

Eu tentei fazer: go get github.com/influxdb/influxdb/releases/tag/v0.8.8mas falha dizendo incapaz de encontrar.

Eu também tentei fazer um regular go getdo branch master, e em seguida, verificar manualmente a tag usando na fim de definir a versão corret.gitGOPATH/src/github...

O problema com a última abordagem é que quando tento puxar as dependências com go get -u -f ./...ele tenta encontrá-las no branch master, e algumas delas não existem no branch master ...

TL; DR : execute go getem uma tag github específica e extraia as dependências corretas.

ESala
fonte
Tente isto .. git tag -a v0.8.8 - "Seu comentário"
Ashok Londhe
2
@AshokLondhe Ele está perguntando como usar uma tag para go get, não como criar uma.
wonderb0lt
@ wonderb0lt este é o comando para adicionar tag.
Ashok Londhe
Acho que tentei descobrir como verificar uma tag específica também, e da última vez que tentei não foi possível ...
wonderb0lt
1
Dê uma olhada nisso . Perto do final, os slides oferecem algumas alternativas de gerenciamento de dependências.
wonderb0lt

Respostas:

35

Não é possível usar a go getferramenta. Em vez disso, você precisa usar uma ferramenta de gerenciamento de pacotes go de terceiros ou criar seus próprios garfos para os pacotes que deseja gerenciar de forma mais refinada.

Falei com um cara que trabalha no Google e ele reconheceu esse problema / requisito, ele disse que a venda que sua equipe usava era volumosa e eles provavelmente vão resolver isso com as ferramentas oficiais em breve.

Consulte Mais informação:

Venda em Go 1.6

A venda foi liberada do experimental no go 1.6 (depois que este post foi escrito inicialmente), o que torna mais fácil o processo de uso de tags / versões específicas de pacotes usando ferramentas de terceiros. go getainda não tem a funcionalidade de buscar tags ou versões específicas.

Mais sobre como o vendedor funciona: Entendendo e usando a pasta do vendedor

Módulos no Go 1.11

Go 1.11 lançou recursos experimentais chamados módulos para melhorar o gerenciamento de dependências, eles esperam lançá-lo como estável no Go 1.12: Informações sobre módulos no Go 1.11

Robin Andersson
fonte
1
Você pode elaborar um pouco mais sobre a parte do google? Há uma grande discussão sobre isso na lista de e-mails da comunidade go, há alguma outra direção que não foi discutida lá?
Not_a_Golfer
1
@Not_a_Golfer Era um cara que não fazia parte da equipe Go, mas falou que atualmente eles usam o vending internamente e que era bem volumoso. Então, eles tinham interesse em resolver isso melhor com as ferramentas oficiais. Mas acho que foi uma declaração não oficial, isso deixará isso mais claro.
Robin Andersson
2
AFAIK, a única proposta é para um formato de arquivo oficial de fornecedor / dependência. Isso ainda é ótimo, pois os projetos não seriam amarrados a uma ferramenta de dependência e podem interoperar com qualquer solução que desejarem (ou seja, eu prefiro o bloqueio de revisão, enquanto outros preferem vender).
JimB de
módulos realmente não lidam com a dependência de compiladores de código, o que nos força a usar go get protoc-gen-go em outro lugar com versão de correção. Assim, precisamos acompanhar o mesmo controle de versão em 2 lugares diferentes (porque as bibliotecas estão fortemente acopladas ao gerador)
Martin Kosicky
24

go mod já está disponível.

Para quem precisa construir um binário de uma tag específica , aqui está o meu jeito:

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

Explicação:

  • O código acima puxa NSQ v1.1.0 e compila nsqd.
  • go mod init .cria um go.modarquivo no diretório atual, que permite o uso go getcom revisão / tags. (veja este link )
  • -d significa "apenas download", se você deseja uma instalação direta, omita este sinalizador e os comandos de construção abaixo desta linha.
  • -v significa "ser prolixo".
  • O código acima é para Windows. Se você usa Linux, substitua bin/nsqd.exepor bin/nsqd.

O módulo baixado é armazenado em %GOPATH%\pkg\mod. Se você não quiser poluir seu GOPATHdiretório, crie um novo e defina seu GOPATHpara ele.

brk
fonte
4
No go 1.13, é go mod initnecessário um id de módulo, por exemplogo mod init local/build
archie
11

Tive sucesso com isso:

  • Execute o comando get sem a tag - ele deve clonar o branch master.
  • Mova para o diretório clone e verifique a tag ou branch que você deseja.
  • Execute o comando go get novamente, ele deve processar o comando no branch com check-out.
Gregory Russell
fonte
4
Na primeira execução, você pode usar go get -d <git-url>apenas para baixar os pacotes e pular a instalação.
webwurst
Isso é o que deve ser usado quando você precisa de uma tag específica, o gopkg.in é muito restritivo.
Hrishikesh Kumar
4

Esta pergunta é anterior aos Módulos Go, mas para referência futura, o procedimento correto no Go 1.11 para buscar uma versão específica é este:

go get github.com/influxdb@[version]

Ou para obter uma tag git específica:

go get github.com/influxdb@[gitref]

emidander
fonte
1

Eu tenho uma abordagem (um tanto hackeada, mas funcionando) para resolver este problema, pelo menos para repositórios git: como os pacotes go get'ed são repositórios de controle de origem normais, pode-se verificar as tags usando ferramentas git normais (poderia usar git da linha de comando , Estou usando o Atlassian SourceTree).

Para compartilhar minha configuração de pacote com meus colegas de equipe, criei um repositório git de meu GOPATH . Em seguida, adicionei todos os pacotes (pelo menos os que queria gerenciar dessa forma) a este repositório como submódulo git. Isso requer que você mova as pastas repo existentes para fora do caminho e as adicione novamente como submódulo git, para não confundir o git. Este processo é um tanto tedioso, mas valeu a pena:

Agora posso enviar commit e push para meu GOPATH-repo sempre que uso um novo pacote go. Quando meus colegas de equipe puxam esse repositório e emitem uma atualização de submódulo git (ou simplesmente atualizam via SoureTree, que faz isso automaticamente), sua versão do pacote é verificada na mesma tag que a minha.

Claro que isso só funciona para pacotes sob controle de origem git ...

Peter Hommel
fonte