pochodzący ze Node
środowiska, którego używałem do instalowania określonej wersji biblioteki dostawcy w folderze projektu ( node_modules
), nakazując npm
zainstalowanie tej wersji tej biblioteki z package.json
konsoli lub nawet bezpośrednio z konsoli, na przykład:
$ npm install express@4.0.0
Następnie zaimportowałem tę wersję tego pakietu do mojego projektu za pomocą:
var express = require('express');
Teraz chcę zrobić to samo z go
. Jak mogę to zrobić? Czy można zainstalować określoną wersję pakietu? Jeśli tak, używając scentralizowanego $GOPATH
, jak mogę zaimportować jedną wersję zamiast drugiej?
Zrobiłbym coś takiego:
$ go get github.com/wilk/uuid@0.0.1
$ go get github.com/wilk/uuid@0.0.2
Ale jak mogę to zmienić podczas importu?
go
package
package-managers
Wilk
źródło
źródło
go get
jest właściwym narzędziem, jeśli chcesz tego zachowania. Możesz wyszukiwać rozwiązania konkretnego problemu.Odpowiedzi:
Wersja 1.11 będzie miała funkcję o nazwie moduły go i możesz po prostu dodać zależność do wersji. Wykonaj następujące kroki:
Oto więcej informacji na ten temat - https://github.com/golang/go/wiki/Modules
źródło
go get github.com/wilk/[email protected]
(zGO111MODULE=on
)go get
, niego mod
.Naprawdę zaskoczony, nikt nie wspomniał o gopkg.in .
gopkg.in
to usługa zapewniająca opakowanie (przekierowanie), które umożliwia wyrażanie wersji jako adresów URL repozytoriów, bez faktycznego tworzenia repozytoriów. Np.gopkg.in/yaml.v1
Vsgopkg.in/yaml.v2
, mimo że oboje mieszkają przy ulhttps://github.com/go-yaml/yaml
Nie jest to idealne rozwiązanie, jeśli autor nie przestrzega odpowiednich praktyk wersjonowania (zwiększając numer wersji podczas łamania wstecznej zgodności), ale działa z gałęziami i znacznikami.
źródło
Możesz użyć
git checkout
aby uzyskać określoną wersję i zbudować swój program przy użyciu tej wersji.Przykład:
źródło
Poślizg to naprawdę eleganckie zarządzanie pakietami dla Go, szczególnie jeśli pochodzisz z npm Node lub ładunku Rusta.
Zachowuje się podobnie do nowej funkcji dostawcy Godep w wersji 1.6, ale jest znacznie łatwiejsza. Twoje zależności i wersje są „zablokowane” wewnątrz katalogu projectdir / vendor bez polegania na GOPATH.
Zainstaluj za pomocą naparu (OS X)
Zainicjuj plik glide.yaml (podobny do pliku package.json). Spowoduje to również pobranie istniejących zaimportowanych pakietów w Twoim projekcie z GOPATH i skopiowanie ich do katalogu / dostawcy projektu.
Zdobądź nowe pakiety
Zaktualizuj i zablokuj wersje pakietów. Spowoduje to utworzenie pliku glide.lock w katalogu projektu, aby zablokować wersje.
Próbowałem Glide i szczęśliwie używam go w moim obecnym projekcie.
źródło
Aktualizacja 18-11-23 : Mod From Go 1.11 jest oficjalnym eksperymentem. Zobacz @krish answer.
Aktualizacja 19-01-01 : Mod From Go 1.12 jest nadal oficjalnym eksperymentem. Począwszy od wersji Go 1.13, tryb modułu będzie domyślnym dla wszystkich programów.
Aktualizacja 19-10-17 : Mod From Go 1.13 jest oficjalnym menedżerem pakietów.
https://blog.golang.org/using-go-modules
Stara odpowiedź:
Możesz ustawić wersję według oficjalnego dep
źródło
go get
, niedep
.Począwszy od wersji 1.5 istnieje „eksperyment dostawcy”, który pomaga w zarządzaniu zależnościami. Od wersji Go 1.6 nie jest to już eksperyment. Na wiki Go jest też kilka innych opcji..
Edycja: jak wspomniano w tej odpowiedzi, gopkg.in jest dobrą opcją do przypinania github-depdencies przed 1.5.
źródło
dep
to oficjalny eksperyment dotyczący zarządzania zależnościami w języku Go. Kompilacja wymaga wersji 1.8 lub nowszej.Aby rozpocząć zarządzanie zależnościami za pomocą
dep
, uruchom następujące polecenie z katalogu głównego projektu:Po wykonaniu zostaną wygenerowane dwa pliki:
Gopkg.toml
(„manifest”),Gopkg.lock
a niezbędne pakiety zostaną pobrane dovendor
katalogu.Załóżmy, że masz projekt korzystający z
github.com/gorilla/websocket
pakietu.dep
wygeneruje następujące pliki:Gopkg.toml
Gopkg.lock
Istnieją polecenia, które pomogą Ci aktualizacja / delete / etc pakietów, należy znaleźć więcej informacji na temat oficjalnego repo github z
dep
(narzędzie zarządzania zależnościach dla Go).źródło
W dzisiejszych czasach możesz po prostu go użyć
go get
. Możesz pobrać swoją zależność za pomocą tagu wersji, gałęzi lub nawet zatwierdzenia.więcej szczegółów tutaj - Jak wskazać zależność modułu Go w go.mod do ostatniego zatwierdzenia w repozytorium?
Go get
zainstaluje również plik binarny, tak jak jest napisane w dokumentacji -Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.
(z https://golang.org/cmd/go/ )
źródło
go get to menedżer pakietów Go. Działa w całkowicie zdecentralizowany sposób, a odnajdywanie pakietów jest nadal możliwe bez centralnego repozytorium hostingu pakietów.
Oprócz lokalizowania i pobierania pakietów inną ważną rolą menedżera pakietów jest obsługa wielu wersji tego samego pakietu. Go przyjmuje najbardziej minimalne i pragmatyczne podejście ze wszystkich menedżerów pakietów. Nie ma czegoś takiego jak wiele wersji pakietu Go.
go get zawsze ściąga z HEAD domyślnej gałęzi w repozytorium. Zawsze. Ma to dwie ważne konsekwencje:
Jako autor pakietu musisz trzymać się stabilnej filozofii HEAD. Twoja domyślna gałąź zawsze musi być stabilną, wydaną wersją twojego pakietu. Musisz pracować w gałęziach funkcji i scalać tylko wtedy, gdy są gotowe do wydania.
Nowe główne wersje Twojego pakietu muszą mieć własne repozytorium. Mówiąc prościej, każda główna wersja twojego pakietu (po wersjonowaniu semantycznym) miałaby swoje własne repozytorium, a tym samym własną ścieżkę importu.
np. github.com/jpoehls/gophermail-v1 i github.com/jpoehls/gophermail-v2.
Jako ktoś budujący aplikację w Go, powyższa filozofia naprawdę nie ma wad. Każda ścieżka importu to stabilny interfejs API. Nie musisz się martwić o numery wersji. Niesamowite!
Więcej informacji: http://zduck.com/2014/go-and-package-versioning/
źródło
go get
Buforowanie oznacza, że przez chwilę nie zauważysz, chyba że masz serwer kompilacji, który za każdym razem aktualizuje Cię do najnowszej wersji. Istnieją zewnętrzne menedżery pakietów, ale w większości są one prymitywne.Podejście, które uznałem za wykonalne, to system podmodułów git . Używając tego możesz podmoduł w danej wersji kodu, a aktualizacja / obniżanie wersji jest jawna i rejestrowana - nigdy nie jest przypadkowa.
Struktura folderów, którą wziąłem z tym, to:
źródło
go get
)To zadziałało dla mnie
GO111MODULE=on go get -u github.com/segmentio/[email protected]
źródło
Istnieje polecenie go edit -replace, aby dołączyć określone zatwierdzenie (nawet z innego rozwidlonego repozytorium) na wierzchu bieżącej wersji pakietu. Fajne w tej opcji jest to, że nie musisz znać wcześniej dokładnej pseudo wersji , wystarczy tylko identyfikator skrótu zatwierdzenia .
Na przykład używam stabilnej wersji pakietu „github.com/onsi/ginkgo v1.8.0”.
Teraz chcę - bez modyfikowania tej linii wymaganego pakietu w go.mod - dołączyć łatkę z mojego widelca, na wierzchu wersji ginkgo:
Po pierwszym zbudowaniu lub przetestowaniu modułu GO spróbuje pobrać nową wersję, a następnie wygeneruje wiersz „zamień” na poprawną pseudo wersję. Na przykład w moim przypadku doda na dole go.mod:
źródło
Mała ściągawka dotycząca zapytań dotyczących modułów.
Aby sprawdzić wszystkie istniejące wersje: np
go list -m -versions github.com/gorilla/mux
Na przykład
go get github.com/gorilla/[email protected]
źródło