Dimulai dengan v1.11 Go menambahkan dukungan untuk modul. Perintah
go mod init <package name>
go build
akan menghasilkan go.mod
dan go.sum
file 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.mod
agar 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.0
tidak sesuai dengan tag rilis terakhir yang dipublikasikan, 20181121201909
akan menjadi stempel waktu commit dan af044c0995fe
akan menjadi hash commit? Haruskah informasi seperti itu ditemukan dan dimasukkan dengan tangan, atau ada cara yang lebih baik?
/commits
, tetapi tidak di bawah/pulls
. Lihat info selengkapnya di sini: golang / go # 31191 secara eksplisit memfilter jenis komitmen ini.go get
go get
adalah cara yang benar untuk memperbarui / menambahgo.mod
seperti yang diminta OP.Selain jawaban dari Everton tentang penggunaan
go get github.com/someone/some_module@af044c0995fe
untuk 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.mod
file Anda , sepertiv0.0.0-20171006230638-a6e239ea1c69
. (Ini membantu menyediakan pengurutan total yang sederhana di semua versi berdasarkan pengurutan semver standar ).sumber
replace
untuk 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 inireplace 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@commithash
danreplace github.com/original/somelib => github.com/fork/somelib commithash
tidak bekerjaSaya 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
setelah ini kami akan dapat melakukannya
go get repo@branchname go get repo@tag go get repo@commithash
sumber
Jika Anda ingin mengganti dependensi ke direktori lokal untuk sementara (misalnya jika Anda mengerjakan 2 modul secara bersamaan), Anda dapat menambahkan
replace
pernyataan di akhirgo.mod
file: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
sumber
Juga jika Anda meletakkan kata terbaru di tempat tag di file go.mod itu akan berubah menjadi tag terbaru modul.
Sebagai contoh:
akan menjadi
module /my/module require ( ... github.com/someone/some_module v2.0.39 ... )
setelah berlari
go mod tidy
sumber