Jak „przejść” do określonego tagu repozytorium github

89

Próbuję skompilować bazę danych InfluxDB (wersja v0.8.8) przy użyciu go get github.com/influxdb/influxdb

Ale to ściąga gałąź główną i potrzebuję v0.8.8tagu.

Próbowałem to zrobić: go get github.com/influxdb/influxdb/releases/tag/v0.8.8ale to nie powiedzie się, mówiąc nie mogę znaleźć.

Próbowałem też zrobić regularny go getoddziału głównego, a następnie ręcznie sprawdzanie tag korzystając gitz GOPATH/src/github...aby ustawić wersję Corret.

Problem z użyciem ostatniego podejścia polega na tym, że kiedy próbuję wyciągnąć za jego pomocą zależności go get -u -f ./..., próbuje je znaleźć w gałęzi master, a niektóre z nich nie istnieją w gałęzi master ...

TL; DR : wykonaj go getna określonym tagu github i pobierz poprawne zależności.

ESala
źródło
Spróbuj tego .. git tag -a v0.8.8 - "Twój komentarz"
Ashok Londhe
2
@AshokLondhe Pyta, jak używać tagu go get, a nie jak go utworzyć.
wonderb0lt
@ wonderb0lt to jest polecenie dodania tagu.
Ashok Londhe
Myślę, że próbowałem też dowiedzieć się, jak sprawdzić konkretny tag, a ostatnim razem nie było to możliwe ...
wonderb0lt
1
Spójrz na to . Pod koniec slajdy przedstawiają alternatywne metody zarządzania zależnościami.
wonderb0lt

Odpowiedzi:

34

Nie jest możliwe użycie tego go getnarzędzia. Zamiast tego musisz użyć zewnętrznego narzędzia do zarządzania pakietami go lub utworzyć własne rozwidlenia dla pakietów, którymi chcesz zarządzać bardziej szczegółowo.

Rozmawiał z facetem, który pracuje w Google i przyznał się do tego problemu / wymagania, powiedział, że sprzedawca, z którego korzystał jego zespół, był nieporęczny i prawdopodobnie wkrótce rozwiąże go za pomocą oficjalnych narzędzi.

Czytaj więcej:

Vendoring in Go 1.6

Vendoring został zwolniony z eksperymentalnej wersji go 1.6 (po tym, jak ten post został napisany), co ułatwia proces używania określonych tagów / wersji pakietów przy użyciu narzędzi innych firm. go getnadal nie ma funkcji pobierania określonych tagów lub wersji.

Więcej o tym, jak działa sprzedawca: Zrozumienie i korzystanie z folderu dostawcy

Moduły w Go 1.11

Go 1.11 wypuściło eksperymentalne funkcje zwane modułami w celu poprawy zarządzania zależnościami, mają nadzieję, że udostępnią je jako stabilne w Go 1.12: Informacje o modułach w Go 1.11

Robin Andersson
źródło
1
Czy możesz wyjaśnić trochę więcej na temat części Google? Na liście dyskusyjnej społeczności go toczy się duża dyskusja na ten temat, czy jest jakiś inny kierunek, który nie został tam omówiony?
Not_a_Golfer
1
@Not_a_Golfer To był facet, który nie był częścią zespołu Go, ale mówił o tym, że obecnie używają wewnętrznego sprzedawcy i że jest to dość nieporęczne. Dlatego byli zainteresowani lepszym rozwiązaniem tego problemu za pomocą oficjalnych narzędzi. Pomyśl, że to było nieoficjalne oświadczenie, ale wyjaśni to.
Robin Andersson
2
AFAIK, jedyna propozycja dotyczy oficjalnego formatu pliku dostawcy / zależności. Jest to nadal świetne, ponieważ projekty nie byłyby powiązane z narzędziem zależności i mogą współpracować z dowolnym rozwiązaniem (tj. Wolę blokowanie wersji, podczas gdy inni wolą sprzedawanie).
JimB
moduły tak naprawdę nie zajmują się zależnością od kompilatorów kodu, co zmusza nas do użycia go get protoc-gen-go w innym miejscu z wersją poprawioną. W ten sposób musimy śledzić tę samą wersję w 2 różnych miejscach (ponieważ biblioteki są ściśle powiązane z generatorem)
Martin Kosicky
24

go mod jest już dostępna.

Dla tych, którzy muszą zbudować plik binarny określonego tagu , oto moja droga:

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

Wyjaśnienie:

  • Powyższy kod ściąga NSQ v1.1.0 i build nsqd.
  • go mod init .tworzy go.modplik w bieżącym katalogu, co umożliwia korzystanie go getz wersji / tagów. (zobacz ten link )
  • -d oznacza „tylko pobieranie”, jeśli chcesz przeprowadzić bezpośrednią instalację, pomiń tę flagę i polecenia budowania poniżej tej linii.
  • -v oznacza „być gadatliwym”.
  • Powyższy kod dotyczy systemu Windows. Jeśli używasz Linuksa, wymienić bin/nsqd.exez bin/nsqd.

Pobrany moduł jest przechowywany w plikach %GOPATH%\pkg\mod. Jeśli nie chcesz zanieczyszczać swojego GOPATHkatalogu, utwórz nowy i ustaw swój GOPATH.

brk
źródło
4
W go 1.13 go mod initpotrzebny jest identyfikator modułu, np.go mod init local/build
archie
11

Odniosłem sukces z tym:

  • Uruchom polecenie get bez tagu - powinno sklonować gałąź master.
  • Przejdź do katalogu klonowania i wyewidencjonuj znacznik lub gałąź, którą chcesz.
  • Uruchom ponownie polecenie go get, powinno ono przetworzyć polecenie w wyewidencjonowanej gałęzi.
Gregory Russell
źródło
4
Przy pierwszym uruchomieniu możesz go get -d <git-url>po prostu pobrać pakiety i pominąć instalację.
webwurst
To jest to, co powinno być używane, gdy potrzebujesz określonego tagu, gopkg.in jest zbyt restrykcyjny.
Hrishikesh Kumar
3

To pytanie poprzedza moduły Go, ale dla przyszłego odniesienia poprawna procedura pobierania określonej wersji w Go 1.11 jest następująca:

go get github.com/influxdb@[version]

Lub aby uzyskać określony tag git:

go get github.com/influxdb@[gitref]

emidander
źródło
1

Mam (nieco hakerskie, ale działające) podejście do rozwiązania tego problemu, przynajmniej w przypadku repozytoriów git: Jak idą pakiety get'ed są normalnymi repozytoriami kontroli źródła, można sprawdzić tagi używając zwykłych narzędzi git (można użyć git z wiersza poleceń , Używam Atlassian SourceTree).

Aby udostępnić moją konfigurację pakietu moim kolegom z zespołu, utworzyłem repozytorium git z mojego GOPATH . Następnie dodałem wszystkie pakiety (przynajmniej te, którymi chciałem zarządzać w ten sposób) do tego repozytorium jako podmoduł git. Wymaga to usunięcia istniejących folderów repozytorium i ponownego dodania ich jako modułu podrzędnego git, aby nie mylić git. Ten proces jest nieco żmudny, ale okazał się wart zachodu:

Teraz mogę zatwierdzać i przesyłać do mojego repozytorium GOPATH za każdym razem, gdy używam nowego pakietu go. Kiedy moi koledzy z zespołu wyciągają z tego repozytorium i wydają aktualizację modułu podrzędnego git (lub po prostu aktualizują za pośrednictwem SoureTree, co robi to automatycznie), ich wersja pakietu zostanie pobrana na tym samym tagu co moja.

Oczywiście działa to tylko dla pakietów pod kontrolą źródła git ...

Peter Hommel
źródło