Począwszy od wersji 1.11 Go dodano obsługę modułów. Polecenia
go mod init <package name>
go build
wygeneruje go.mod
i go.sum
pliki zawierające wszystkie znalezione wersje dla zależności pakietów.
Jeśli moduł nie ma żadnych wersji, używane jest najnowsze zatwierdzenie tego modułu. Jeśli moduł ma wersje, najnowsza jest wybierana jako zależność.
Jednak czasami potrzebowałbym funkcjonalności, której nie ma jeszcze w opublikowanym wydaniu, ale z zatwierdzenia dokonanego po tym wydaniu. Jak ustawić go.mod
wskazanie nie do wydania modułu, ale do konkretnego zatwierdzenia w repozytorium modułu?
Wygląda na to, że mogę to zrobić ręcznie w go.mod z
module /my/module
require (
...
github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe
...
)
gdzie v0.0.0
nie odpowiada ostatnio opublikowanemu znacznikowi wydania, 20181121201909
czy byłby to znacznik czasu zatwierdzenia i af044c0995fe
czy byłby skrót zatwierdzenia? Czy takie informacje należy wyszukiwać i wprowadzać ręcznie, czy jest lepszy sposób?
/commits
, ale nie poniżej/pulls
. Zobacz więcej informacji tutaj: golang / go # 31191 jawnie odfiltrowuje tego rodzaju zatwierdzenia.go get
go get
to właściwy sposób na aktualizację / dodaniego.mod
w sposób, w jaki prosił OP.Oprócz odpowiedzi od Evertonu na temat używania
go get github.com/someone/some_module@af044c0995fe
do uzyskania konkretnego zatwierdzenia, możesz również użyć nazw gałęzi, takich jak:go get github.com/someone/some_module@master
go get github.com/someone/some_module@dev_branch
Te przykłady pobierają najnowsze zatwierdzenie w odpowiedniej gałęzi.
Nadal zostanie nagrany jako pseudo-wersja w twoim
go.mod
pliku, na przykładv0.0.0-20171006230638-a6e239ea1c69
. (Pomaga to zapewnić prostą łączną kolejność we wszystkich wersjach w oparciu o standardową kolejność semverów ).źródło
replace
użyć tymczasowego rozwidlenia jakiejś zależności, ale nie mogłem znaleźć sposobu, aby to zastąpić, aby wskazać na jakieś zatwierdzenie. Musiałem stworzyć tag wersji i określić go w ten sposóbreplace github.com/original/somelib => github.com/fork/somelib v1.2.3
, co jest trochę za dużo, gdy chcę po prostu szybko przetestować.replace github.com/original/somelib => github.com/fork/somelib@commithash
ireplace github.com/original/somelib => github.com/fork/somelib commithash
nie działająOd jakiegoś czasu walę głową, że jak to działa na wszystkich i nie jestem w stanie tego uruchomić. Dla mnie musiałem zobowiązać się do master branch, wtedy tylko byłem w stanie go zdobyć.
Aby przejść do pracy z określoną gałęzią, identyfikatorem zatwierdzenia lub tagiem, musisz włączyć flagę dla modułu go, uruchamiając poniższe polecenie
po tym będziemy w stanie zrobić
go get repo@branchname go get repo@tag go get repo@commithash
źródło
Jeśli chcesz tymczasowo podstawić zależność do katalogu lokalnego (na przykład, jeśli pracujesz na 2 modułach jednocześnie), możesz dodać
replace
instrukcję na końcugo.mod
pliku:module example.com/mypkg go 1.15 require ( gitlab.com/someone/a_package v0.14.2 ) replace gitlab.com/someone/a_package => ../my_forks/a_package
źródło
Również jeśli umieścisz słowo najnowszy w miejscu tagu w pliku go.mod, zostanie ono zmienione na najnowszy tag modułów.
Na przykład:
stanie się
module /my/module require ( ... github.com/someone/some_module v2.0.39 ... )
po bieganiu
go mod tidy
źródło