Come "andare a prendere" su un tag specifico di un repository GitHub


89

Sto cercando di compilare il database InfluxDB (versione v0.8.8) usando go get github.com/influxdb/influxdb

Ma questo tira il ramo principale e ho bisogno del v0.8.8tag.

Ho provato a farlo: go get github.com/influxdb/influxdb/releases/tag/v0.8.8ma questo non riesce a dire impossibile trovare.

Ho anche provato a fare un regolare go getdel ramo master, e quindi a controllare manualmente il tag usando gitin GOPATH/src/github...per impostare la versione corretta.

Il problema con l'ultimo approccio è che quando provo a estrarre le dipendenze con go get -u -f ./...esso cerca di trovarle nel ramo principale, e alcune di esse non esistono nel ramo principale ...

TL; DR : esegue go getsu un tag github specifico e recupera le dipendenze corrette.


Prova questo .. git tag -a v0.8.8 - "Il tuo commento"
Ashok Londhe

2
@AshokLondhe Chiede come usare un tag per go get, non come crearne uno.
wonderb0lt

@ wonderb0lt questo è il comando per aggiungere tag.
Ashok Londhe

Penso di aver provato a scoprire come controllare anche un tag specifico e l'ultima volta che ho provato non è stato possibile ...
wonderb0lt

1
Dai un'occhiata a questo . Verso la fine le diapositive offrono alcune alternative per la gestione delle dipendenze.
wonderb0lt

Risposte:


35

Non è possibile utilizzare lo go getstrumento. Invece è necessario utilizzare uno strumento di gestione dei pacchetti go di terze parti o creare i propri fork per i pacchetti che si desidera gestire in modo più dettagliato.

Ho parlato con un ragazzo che lavora in Google e ha riconosciuto questo problema / requisito, ha detto che il fornitore utilizzato dal suo team era ingombrante e probabilmente lo risolveranno presto con gli strumenti ufficiali.

Leggi di più:

Vendita in Go 1.6

Il vendoring è stato rilasciato dalla versione sperimentale in go 1.6 (dopo che questo post è stato inizialmente scritto) che semplifica il processo di utilizzo di tag / versioni specifiche di pacchetti utilizzando strumenti di terze parti. go getnon ha ancora la funzionalità per recuperare tag o versioni specifici.

Ulteriori informazioni su come funziona il vendor : Comprensione e utilizzo della cartella del fornitore

Moduli in Go 1.11

Go 1.11 ha rilasciato una funzionalità sperimentale chiamata moduli per migliorare la gestione delle dipendenze, sperano di rilasciarlo come stabile in Go 1.12: Informazioni sui moduli in Go 1.11


1
Puoi approfondire un po 'di più sulla parte di Google? C'è una grande discussione su questo nella mailing list della comunità go, c'è qualche altra direzione che non è stata discussa lì?
Not_a_Golfer

1
@Not_a_Golfer Era un ragazzo che non faceva parte del team di Go, ma ha detto che attualmente usano il vendoring internamente e che era piuttosto ingombrante. Quindi avevano interesse a risolverlo meglio con gli strumenti ufficiali. Pensare che fosse una dichiarazione non ufficiale, però, lo renderà più chiaro.
Robin Andersson

2
Per quanto ne so, l'unica proposta è per un formato di file fornitore / dipendenza ufficiale. Questo è ancora ottimo, in quanto i progetti non sarebbero legati a uno strumento di dipendenza e possono interagire con qualsiasi soluzione desiderino (cioè io preferisco il blocco delle revisioni, mentre altri preferiscono il vendoring).
JimB

i moduli non si occupano realmente della dipendenza dai compilatori di codice, il che ci costringe a usare go get protoc-gen-go da qualche altra parte con la versione fix. Quindi tenendoci a dover tenere traccia della stessa versione in 2 posti diversi (perché le librerie sono strettamente accoppiate con il generatore)
Martin Kosicky

24

go mod è ora disponibile.

Per coloro che hanno bisogno di costruire un binario di un tag specifico , ecco la mia strada:

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

Spiegazione:

  • Il codice precedente estrae NSQ v1.1.0 e build nsqd.
  • go mod init .crea un go.modfile nella directory corrente, che consente l'utilizzo go getcon revisioni / tag. (vedi questo link )
  • -d significa "solo download", se vuoi un'installazione diretta, ometti questo flag ei ​​comandi di build sotto questa riga.
  • -v significa "essere verboso".
  • Il codice sopra è per Windows. Se usi Linux, sostituisci bin/nsqd.execon bin/nsqd.

Il modulo scaricato viene archiviato in %GOPATH%\pkg\mod. Se non vuoi inquinare la tua GOPATHdirectory, creane una nuova e impostala GOPATH.


4
Nella versione 1.13, è go mod initnecessario un ID modulo, ad esempiogo mod init local/build
archie

11

Ho avuto successo con questo:

  • Esegui il comando get senza il tag: dovrebbe clonare il ramo principale.
  • Spostati nella directory clone ed esegui il checkout del tag o del ramo che desideri.
  • Esegui di nuovo il comando go get, dovrebbe elaborare il comando sul ramo estratto.

4
Alla prima esecuzione potresti go get -d <git-url>semplicemente scaricare i pacchetti e saltare l'installazione.
webwurst

Questo è ciò che dovrebbe essere usato quando hai bisogno di un tag specifico, il gopkg.in è troppo restrittivo.
Hrishikesh Kumar

4

Questa domanda è precedente ai moduli Go, ma per riferimento futuro la procedura corretta in Go 1.11 per il recupero di una versione specifica è questa:

go get github.com/influxdb@[version]

O per ottenere un tag git specifico:

go get github.com/influxdb@[gitref]


1

Ho un approccio (un po 'hacker, ma funzionante) per affrontare questo problema, almeno per i repository git: poiché i pacchetti go get'ed sono normali repository di controllo del codice sorgente, si possono controllare i tag usando i normali strumenti git (potrebbe usare git dalla riga di comando , Sto usando Atlassian SourceTree).

Per condividere la configurazione del mio pacchetto con i miei compagni di squadra, ho creato un repository git dal mio GOPATH . Ho quindi aggiunto tutti i pacchetti (almeno quelli che volevo gestire in questo modo) a questo repository come sottomodulo git. Ciò richiede di spostare le cartelle dei repository esistenti e aggiungerle di nuovo come sottomodulo git, per non confondere git. Questo processo è un po 'noioso, ma si è rivelato valerne la pena:

Ora posso eseguire il commit e il push nel mio repository GOPATH ogni volta che utilizzo un nuovo pacchetto go. Quando i miei compagni di squadra estraggono da questo repository e rilasciano un aggiornamento del sottomodulo git (o semplicemente aggiornano tramite SoureTree, che lo fa automaticamente), la loro versione del pacchetto viene verificata sullo stesso tag del mio.

Ovviamente questo funziona solo per i pacchetti sotto il controllo del codice sorgente git ...


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.