Go.mod'daki Go modülü bağımlılığını bir depodaki en son yürütmeye nasıl yönlendirebilirim?


104

V1.11 Go ile başlayarak modüller için destek eklendi. Komutlar

go mod init <package name>
go build

üretecek go.modve go.sumpaket bağımlılıkları için bulunan tüm sürümlerini içerir dosyaları.

Bir modülün herhangi bir sürümü yoksa, o modülün en son kaydı kullanılır. Bir modülün sürümleri varsa, en sonuncusu bağımlılık olarak seçilir.

Ancak bazen, henüz yayınlanmış bir sürümde olmayan, ancak bu sürümden sonra yapılan bir taahhütte bulunan işlevlere ihtiyacım olabilir. Nasıl belirlerim go.modbir modülün bir sürüme değil işaret etmek, ancak Belli bir bölüme modülün depoda taahhüt?

Görünüşe göre bunu go.mod ile elle yapabilirim

module /my/module

require (
...
github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe
...
)

nerede v0.0.0son yayınlanan sürüm etiketine karşılık gelmez, 20181121201909bir commit zaman damgası af044c0995feolur ve commit karması olur? Bu tür bilgiler elle bulunmalı ve girilmeli mi yoksa daha iyi bir yol mu var?

Yanıtlar:


159

Sadece istediğiniz commit hash'ına 'gidin':

go get github.com/someone/some_module@af044c0995fe

'go get' bağımlılık dosyalarını (go.mod, go.sum) doğru şekilde güncelleyecektir.

Daha fazla bilgi: https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies


4
" Bilinmeyen revizyon " veya " geçersiz sürüm " hatası alıyorsanız - PR hash (çekme isteği) belirtmediğinizden emin olun . Birleştirilmiş bir PR bile yanlış olabilir. Depodaki commit karmasını arayın /commits, ancak altında değil /pulls. Daha fazla bilgiyi burada bulabilirsiniz: golang / go # 31191 bu tür taahhütleri açıkça filtreler.
Noam Manos

1
OP, nasıl yapılacağını değil, go.mod dosyasına nasıl go get
ekleneceğini soruyor

2
@ Nulik go get, go.modOP'nin istediği şekilde güncelleme / ekleme yapmanın doğru yoludur .
Dave C

95

Everton'dan belirli bir taahhüt almak için kullanma yanıtına ek olarak, go get github.com/someone/some_module@af044c0995feaşağıdaki gibi şube adlarını da kullanabilirsiniz:

  • go get github.com/someone/some_module@master
  • go get github.com/someone/some_module@dev_branch

Bu örnekler, ilgili daldaki en son kaydı alır.

Hala olarak kaydedilecektir sözde sürümü sizin de go.modgibi, dosyaya v0.0.0-20171006230638-a6e239ea1c69. (Bu, standart semver sıralamasına göre tüm sürümlerde basit bir toplam sıralama sağlamaya yardımcı olur ).


9
sözde sürüm açıklaması için teşekkürler. replaceBazı bağımlılıkların geçici bir çatalını kullanmaya çalışıyordum , ancak bu ikamenin bir kesinliğe işaret etmesini sağlayacak bir yol bulamadım. Bir sürüm etiketi oluşturmam ve bunu böyle belirtmem gerekiyordu replace github.com/original/somelib => github.com/fork/somelib v1.2.3, bu da sadece hızlı bir şekilde test etmek istediğimde biraz fazla oluyor. replace github.com/original/somelib => github.com/fork/somelib@commithashve replace github.com/original/somelib => github.com/fork/somelib commithashçalışmıyor
Zhandos Zhylkaidar

6

Bir süredir herkes için nasıl çalıştığı konusunda kafamı beceriyordum ve onu çalıştıramıyorum. Benim için dalda uzmanlaşmak zorunda kaldım, o zaman sadece alabildim.

Belirli bir dal, commit kimliği veya etiket ile çalışmaya başlamak için aşağıdaki komutu çalıştırarak go modülü için bir bayrak etkinleştirmeniz gerekir

go env -w GO111MODULE = açık

bundan sonra yapabileceğiz

go get repo@branchname
go get repo@tag
go get repo@commithash

2

Bir bağımlılığı geçici olarak yerel bir dizine değiştirmek istiyorsanız (örneğin aynı anda 2 modül üzerinde çalışıyorsanız) dosyanın replacesonuna ifade ekleyebilirsiniz go.mod:

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

0

Ayrıca, go.mod dosyasındaki etiketin yerine en yeni kelimeyi koyarsanız, modüllerdeki en son etikete değiştirilir.

Örneğin:

module /my/module

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

Olacak

module /my/module

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

koşu sonrası go mod tidy

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.