从v1.11开始,添加了对模块的支持。命令
go mod init <package name>
go build
将生成go.mod
和go.sum
文件,这些文件包含所有与软件包相关的版本。
如果模块没有任何版本,则使用该模块的最新提交。如果某个模块确实具有发行版,则将最新的一个作为依赖项。
但是,有时我需要的功能不是发布的版本,而是该版本之后的提交。如何将go.mod
设置为不指向模块版本,而是指向模块存储库中的特定提交?
看起来我可以用go.mod手动完成
module /my/module
require (
...
github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe
...
)
其中v0.0.0
与上次发布的发行标签不对应,20181121201909
是提交时间戳,af044c0995fe
是提交哈希吗?应该手动找到并输入此类信息,还是有更好的方法?
答案 0 :(得分:18)
只需“转到”所需的提交哈希值即可:
go get github.com/someone/some_module@af044c0995fe
“获取”将正确更新依赖项文件(go.mod,go.sum)。
更多信息:https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies
答案 1 :(得分:13)
除了Everton的answer使用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
文件中的pseudo-version,例如v0.0.0-20171006230638-a6e239ea1c69
。 (这有助于提供基于标准semver排序的所有版本之间的简单总排序。)
答案 2 :(得分:7)
一段时间以来,我一直在head头,它对每个人都有效,但我无法运行它。对我来说,我必须提交到master分支,然后才能够获得它。
要开始使用特定分支,提交ID或标记,请通过运行以下命令为go模块启用标志
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
答案 4 :(得分:1)
此外,如果您在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
答案 5 :(得分:1)
go get your-repo@branch-name
使用要添加到 require
或 replace
的 go 模块版本读取输出:
go list -m -json your-repo@branch-name | jq '.|"\(.Path) \(.Version)"'
jq
- 手动组合 Path
和 Version
结果的值:go list -m -json your-repo@branch-name