Jak wskazać zależność modułu Go w go.mod do ostatniego zatwierdzenia w repozytorium?

111

Począwszy od wersji 1.11 Go dodano obsługę modułów. Polecenia

go mod init <package name>
go build

wygeneruje go.modi go.sumpliki 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.modwskazanie 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.0nie odpowiada ostatnio opublikowanemu znacznikowi wydania, 20181121201909czy byłby to znacznik czasu zatwierdzenia i af044c0995feczy byłby skrót zatwierdzenia? Czy takie informacje należy wyszukiwać i wprowadzać ręcznie, czy jest lepszy sposób?

dimus
źródło

Odpowiedzi:

171

Po prostu `` idź '' do skrótu zatwierdzenia, który chcesz:

go get github.com/someone/some_module@af044c0995fe

Polecenie „go get” poprawnie zaktualizuje pliki zależności (go.mod, go.sum).

Więcej informacji: https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies

Everton
źródło
4
W przypadku wystąpienia błędu „ nieznana wersja ” lub „ nieprawidłowa wersja ” - Upewnij się, że nie określono skrótu PR (żądanie ściągnięcia). Nawet połączony PR może być zły. Poszukaj skrótu zatwierdzenia w repozytorium poniżej /commits, ale nie poniżej /pulls. Zobacz więcej informacji tutaj: golang / go # 31191 jawnie odfiltrowuje tego rodzaju zatwierdzenia.
Noam Manos
1
OP pyta, jak dodać go do pliku go.mod, a nie jak to zrobićgo get
Nulik
2
@Nulik go getto właściwy sposób na aktualizację / dodanie go.modw sposób, w jaki prosił OP.
Dave C
95

Oprócz odpowiedzi od Evertonu na temat używania go get github.com/someone/some_module@af044c0995fedo 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.modpliku, na przykład v0.0.0-20171006230638-a6e239ea1c69. (Pomaga to zapewnić prostą łączną kolejność we wszystkich wersjach w oparciu o standardową kolejność semverów ).

typowe182
źródło
10
dzięki za wyjaśnienie pseudo-wersji. Próbowałem replaceuż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ób replace 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@commithashi replace github.com/original/somelib => github.com/fork/somelib commithashnie działają
Zhandos Zhylkaidar
8

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

go env -w GO111MODULE = on

po tym będziemy w stanie zrobić

go get repo@branchname
go get repo@tag
go get repo@commithash
Chaitanya Gadkari
źródło
3

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ć replaceinstrukcję na końcu go.modpliku:

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
dimus
źródło
2

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:

module /my/module

require (
...
github.com/someone/some_module latest
...
)

stanie się

module /my/module

require (
...
github.com/someone/some_module v2.0.39
...
)

po bieganiu go mod tidy

JFW
źródło