จะชี้การพึ่งพาโมดูล Go ใน go.mod ไปยังการกระทำล่าสุดใน repo ได้อย่างไร


111

เริ่มต้นด้วย v1.11 Go เพิ่มการสนับสนุนสำหรับโมดูล คำสั่ง

go mod init <package name>
go build

จะสร้างgo.modและgo.sumไฟล์ที่มีเวอร์ชันที่พบทั้งหมดสำหรับการอ้างอิงแพ็กเกจ

หากโมดูลไม่มีรีลีสใด ๆ จะใช้คอมมิตล่าสุดของโมดูลนั้น หากโมดูลมีรีลีสโมดูลล่าสุดจะถูกเลือกเป็นการอ้างอิง

อย่างไรก็ตามบางครั้งฉันต้องการฟังก์ชันที่ยังไม่ได้อยู่ในรุ่นที่เผยแพร่ แต่จากการคอมมิตที่ทำหลังจากรุ่นนั้น ฉันจะตั้งค่าgo.modไม่ให้ชี้ไปที่รีลีสของโมดูลได้อย่างไร แต่เป็นการคอมมิตเฉพาะในที่เก็บของโมดูล

ดูเหมือนว่าฉันสามารถทำได้ด้วยมือไปแล้ว Mod ด้วย

module /my/module

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

โดยที่v0.0.0ไม่ตรงกับแท็กรุ่นที่เผยแพร่ล่าสุด20181121201909จะเป็นการประทับเวลาคอมมิตและaf044c0995feจะเป็นคอมมิตแฮชหรือไม่ ข้อมูลดังกล่าวควรหาและป้อนด้วยมือหรือมีวิธีที่ดีกว่านี้?

คำตอบ:


171

เพียงแค่ 'ไปรับ' ที่แฮชคอมมิตที่คุณต้องการ:

go get github.com/someone/some_module@af044c0995fe

'go get' จะอัปเดตไฟล์อ้างอิง (go.mod, go.sum) อย่างถูกต้อง

ข้อมูลเพิ่มเติม: https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies


4
ในกรณีที่ได้รับข้อผิดพลาด " การแก้ไขที่ไม่รู้จัก " หรือ " เวอร์ชันที่ไม่ถูกต้อง " - ตรวจสอบให้แน่ใจว่าคุณไม่ได้ระบุแฮชของ PR (คำขอดึง) แม้แต่ PR แบบรวมก็อาจผิดพลาดได้ มองหากระทำกัญชาในภายใต้ซื้อคืนแต่ไม่อยู่ภายใต้/commits /pullsดูข้อมูลเพิ่มเติมที่นี่: golang / go # 31191กรองการกระทำประเภทนี้ออกอย่างชัดเจน
Noam Manos

1
OP ถามวิธีเพิ่มไปยังไฟล์ go.mod ไม่ใช่วิธีการทำgo get
Nulik

2
@Nulik go getเป็นวิธีที่ถูกต้องในการอัปเดต / เพิ่มเติมgo.modในวิธีที่ OP ขอ
Dave C

95

นอกจากคำตอบจาก Everton เกี่ยวกับการใช้go get github.com/someone/some_module@af044c0995feเพื่อรับคอมมิตเฉพาะแล้วคุณยังสามารถใช้ชื่อสาขาเช่น:

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

ตัวอย่างเหล่านั้นได้รับการคอมมิตล่าสุดในสาขาที่เกี่ยวข้อง

จะยังคงถูกบันทึกเป็นเวอร์ชันหลอกในgo.modไฟล์ของคุณเช่นv0.0.0-20171006230638-a6e239ea1c69. (สิ่งนี้ช่วยให้มีการสั่งซื้อรวมอย่างง่ายในทุกเวอร์ชันโดยยึดตามลำดับsemverมาตรฐาน)


10
ขอบคุณสำหรับคำอธิบายรุ่นหลอก ฉันพยายามreplaceใช้ส้อมชั่วคราวของการพึ่งพาบางอย่าง แต่ไม่สามารถหาวิธีที่จะทำการแทนที่เพื่อชี้ไปที่การกระทำ ต้องสร้างแท็กเวอร์ชันและระบุแบบนี้replace github.com/original/somelib => github.com/fork/somelib v1.2.3ซึ่งค่อนข้างมากเกินไปเมื่อฉันต้องการทดสอบอย่างรวดเร็ว replace github.com/original/somelib => github.com/fork/somelib@commithashและ replace github.com/original/somelib => github.com/fork/somelib commithashไม่ทำงาน
Zhandos Zhylkaidar

8

ฉันกระแทกหัวของฉันมาระยะหนึ่งแล้วว่ามันได้ผลสำหรับทุกคนและฉันไม่สามารถเรียกใช้มันได้ สำหรับฉันฉันต้องเข้าเรียนในสาขาหลักแล้วมีเพียงฉันเท่านั้นที่จะได้มันมา

สำหรับ go get to work กับสาขาที่ระบุยืนยัน id หรือ tag คุณต้องเปิดใช้งานแฟล็กสำหรับโมดูล go โดยเรียกใช้คำสั่งด้านล่าง

ไป env -w GO111MODULE = on

หลังจากนี้เราจะสามารถทำได้

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

3

หากคุณต้องการแทนที่การอ้างอิงกับโลคัลไดเร็กทอรีชั่วคราว (ตัวอย่างเช่นหากคุณทำงานกับ 2 โมดูลพร้อมกัน) คุณสามารถเพิ่มreplaceคำสั่งที่ท้าย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

2

นอกจากนี้หากคุณใส่คำล่าสุดแทนแท็กในไฟล์ go.mod มันจะถูกเปลี่ยนเป็นแท็กล่าสุดของโมดูล

ตัวอย่างเช่น:

module /my/module

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

จะกลายเป็น

module /my/module

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

หลังจากวิ่ง go mod tidy

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.