Làm thế nào để trỏ sự phụ thuộc của mô-đun Go trong go.mod đến một cam kết mới nhất trong một repo?


104

Bắt đầu với v1.11 Go hỗ trợ thêm cho các mô-đun. Lệnh

go mod init <package name>
go build

sẽ tạo go.modgo.sumcác tệp chứa tất cả các phiên bản được tìm thấy cho các gói phụ thuộc.

Nếu một mô-đun không có bất kỳ bản phát hành nào, cam kết mới nhất của mô-đun đó sẽ được sử dụng. Nếu một mô-đun có bản phát hành, thì bản mới nhất được chọn làm phụ thuộc.

Tuy nhiên, đôi khi tôi sẽ cần chức năng chưa có trong bản phát hành đã xuất bản, nhưng từ một cam kết được thực hiện sau bản phát hành đó. Làm cách nào để tôi go.modkhông trỏ đến bản phát hành của một mô-đun, mà chỉ đến một cam kết cụ thể trong kho lưu trữ của mô-đun?

Có vẻ như tôi có thể làm điều đó bằng tay trong go.mod với

module /my/module

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

nơi v0.0.0không tương ứng với thẻ phát hành được xuất bản cuối cùng, 20181121201909sẽ là dấu thời gian cam kết và af044c0995fesẽ là băm cam kết? Nên tìm và nhập thông tin như vậy bằng tay, hay có cách nào tốt hơn?

Câu trả lời:


159

Chỉ cần 'đi lấy' ở băm cam kết mà bạn muốn:

go get github.com/someone/some_module@af044c0995fe

'go get' sẽ cập nhật chính xác các tệp phụ thuộc (go.mod, go.sum).

Thông tin thêm: https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies


4
Trong trường hợp nhận được lỗi " bản sửa đổi không xác định " hoặc " phiên bản không hợp lệ " - Đảm bảo rằng bạn không chỉ định băm PR (yêu cầu kéo). Ngay cả một bài PR hợp nhất cũng có thể sai. Tìm băm cam kết trong repo dưới /commits, nhưng không dưới /pulls. Xem thêm thông tin tại đây: golang / go # 31191 lọc ra các loại cam kết này một cách rõ ràng.
Noam Manos

1
OP hỏi cách thêm nó vào tệp go.mod, chứ không phải cách thực hiệngo get
Nulik

2
@Nulik go getlà cách chính xác để cập nhật / bổ sung go.modtheo cách OP yêu cầu.
Dave C

95

Ngoài câu trả lời từ Everton về việc sử dụng go get github.com/someone/some_module@af044c0995feđể có được một cam kết cụ thể, bạn cũng có thể sử dụng các tên nhánh như:

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

Những ví dụ đó nhận được cam kết mới nhất trên nhánh tương ứng.

Nó sẽ vẫn được ghi lại dưới dạng phiên bản giả trong go.modtệp của bạn , chẳng hạn như v0.0.0-20171006230638-a6e239ea1c69. (Điều này giúp cung cấp một thứ tự tổng đơn giản trên tất cả các phiên bản dựa trên thứ tự semver tiêu chuẩn ).


9
cảm ơn cho lời giải thích phiên bản giả. tôi đã cố gắng thực hiện replaceđể sử dụng một nhánh phụ tạm thời của một số phụ thuộc, nhưng không thể tìm ra cách thực hiện thay thế đó để trỏ đến một số cam kết. Phải tạo một thẻ phiên bản và chỉ định nó như thế này replace github.com/original/somelib => github.com/fork/somelib v1.2.3, hơi quá khi tôi chỉ muốn nhanh chóng kiểm tra mọi thứ. replace github.com/original/somelib => github.com/fork/somelib@commithashreplace github.com/original/somelib => github.com/fork/somelib commithashkhông làm việc
Zhandos Zhylkaidar

6

Tôi đã đập đầu óc mình rằng nó hoạt động như thế nào đối với tất cả mọi người và tôi không thể chạy nó. Đối với tôi, tôi đã phải cam kết với nhánh master thì chỉ tôi mới có thể lấy được nó.

Để bắt đầu làm việc với nhánh, id cam kết hoặc thẻ cụ thể, bạn cần kích hoạt mô-đun cờ for go bằng cách chạy lệnh dưới đây

go env -w GO111MODULE = on

sau này chúng ta sẽ có thể làm

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

2

Nếu bạn muốn tạm thời thay thế một phần phụ thuộc vào một thư mục cục bộ (ví dụ: nếu bạn làm việc trên 2 mô-đun đồng thời), bạn có thể thêm replacecâu lệnh vào cuối go.modtệp:

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

Ngoài ra, nếu bạn đặt từ mới nhất vào vị trí của thẻ trong tệp go.mod, nó sẽ được thay đổi thành thẻ mới nhất trong mô-đun.

Ví dụ:

module /my/module

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

sẽ trở thành

module /my/module

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

sau khi chạy go mod tidy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.