Bagaimana cara mengarahkan ketergantungan modul Go di go.mod ke komit terbaru di repo?

111

Dimulai dengan v1.11 Go menambahkan dukungan untuk modul. Perintah

go mod init <package name>
go build

akan menghasilkan go.moddan go.sumfile yang berisi semua versi yang ditemukan untuk dependensi paket.

Jika modul tidak memiliki rilis apa pun, komit terbaru dari modul itu akan digunakan. Jika sebuah modul memiliki rilis, yang terbaru akan dipilih sebagai dependensi.

Namun terkadang saya membutuhkan fungsionalitas yang belum dirilis, tetapi dari komit yang dibuat setelah rilis itu. Bagaimana cara mengatur go.modagar tidak menunjuk ke rilis modul, tetapi ke komit tertentu dalam repositori modul?

Sepertinya saya bisa melakukannya dengan tangan di go.mod dengan

module /my/module

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

di mana v0.0.0tidak sesuai dengan tag rilis terakhir yang dipublikasikan, 20181121201909akan menjadi stempel waktu commit dan af044c0995feakan menjadi hash commit? Haruskah informasi seperti itu ditemukan dan dimasukkan dengan tangan, atau ada cara yang lebih baik?

dimus
sumber

Jawaban:

171

Cukup 'dapatkan' pada hash komit yang Anda inginkan:

go get github.com/someone/some_module@af044c0995fe

'go get' akan memperbarui file dependensi dengan benar (go.mod, go.sum).

Informasi lebih lanjut: https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies

Everton
sumber
4
Jika mendapatkan kesalahan " revisi tidak diketahui " atau " versi tidak valid " - Pastikan Anda tidak menentukan hash PR (permintaan tarik). Bahkan PR gabungan mungkin salah. Cari hash komit di repo di bawah /commits, tetapi tidak di bawah /pulls. Lihat info selengkapnya di sini: golang / go # 31191 secara eksplisit memfilter jenis komitmen ini.
Noam Manos
1
OP bertanya bagaimana menambahkannya ke file go.mod, bukan bagaimana melakukango get
Nulik
2
@Nulik go getadalah cara yang benar untuk memperbarui / menambah go.modseperti yang diminta OP.
Dave C
95

Selain jawaban dari Everton tentang penggunaan go get github.com/someone/some_module@af044c0995feuntuk mendapatkan komit tertentu, Anda juga dapat menggunakan nama cabang seperti:

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

Contoh tersebut mendapatkan komit terbaru di cabang terkait.

Ini akan tetap direkam sebagai versi pseudo di go.modfile Anda , seperti v0.0.0-20171006230638-a6e239ea1c69. (Ini membantu menyediakan pengurutan total yang sederhana di semua versi berdasarkan pengurutan semver standar ).

tipikal182
sumber
10
terima kasih atas penjelasan versi semu. Saya mencoba melakukan a replaceuntuk menggunakan garpu sementara dari beberapa ketergantungan, tetapi tidak dapat menemukan cara untuk membuat pengganti itu menunjuk ke beberapa komit. Harus membuat tag versi dan menentukannya seperti ini replace github.com/original/somelib => github.com/fork/somelib v1.2.3, yang agak terlalu berlebihan ketika saya hanya ingin menguji sesuatu dengan cepat. replace github.com/original/somelib => github.com/fork/somelib@commithashdan replace github.com/original/somelib => github.com/fork/somelib commithashtidak bekerja
Zhandos Zhylkaidar
7

Saya telah membenturkan kepala saya untuk beberapa waktu bahwa cara kerjanya untuk semua orang dan saya tidak dapat menjalankannya. Bagi saya, saya harus berkomitmen untuk menguasai cabang maka hanya saya yang bisa mendapatkannya.

Untuk mulai bekerja dengan cabang tertentu, commit id atau tag, Anda perlu mengaktifkan flag untuk modul go dengan menjalankan perintah di bawah ini

go env -w GO111MODULE = on

setelah ini kami akan dapat melakukannya

go get repo@branchname
go get repo@tag
go get repo@commithash
Chaitanya Gadkari
sumber
3

Jika Anda ingin mengganti dependensi ke direktori lokal untuk sementara (misalnya jika Anda mengerjakan 2 modul secara bersamaan), Anda dapat menambahkan replacepernyataan di akhir go.modfile:

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
sumber
2

Juga jika Anda meletakkan kata terbaru di tempat tag di file go.mod itu akan berubah menjadi tag terbaru modul.

Sebagai contoh:

module /my/module

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

akan menjadi

module /my/module

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

setelah berlari go mod tidy

JFW
sumber