如何将go.mod中的Go模块依赖项指向存储库中的最新提交?


111

从v1.11开始,Go添加了对模块的支持。指令

go mod init <package name>
go build

会生成go.modgo.sum文件,其中包含找到的所有软件包依赖版本。

如果模块没有任何发行版,则使用该模块的最新提交。如果某个模块确实具有发行版,则将最新的一个作为依赖项。

但是有时我需要的功能不是发布的版本,而是该版本之后的提交。如何设置go.mod为不指向模块的发行版,而是指向模块存储库中的特定提交?

看起来我可以用go.mod手动完成

module /my/module

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

v0.0.0与上次发布的发布标记不符的地方20181121201909是提交时间戳,af044c0995fe是提交哈希?应该手动找到并输入此类信息,还是有更好的方法?

Answers:


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也可能是错误的。在下的repo中查找提交哈希/commits,但不在下/pulls。在此处查看更多信息:golang / go#31191明确过滤掉此类提交。
Noam Manos

1
OP询问如何将其添加到go.mod文件中,而不是如何执行go get
Nulik

2
@Nulikgo getgo.mod按照OP要求的正确方法进行更新/添加。
Dave C'9

95

除了埃弗顿提供的有关获得特定提交的答案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使用某些依赖项的临时派生,但找不到一种方法来进行替换以指向某些提交。必须创建一个version标签并像这样指定它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

7

一段时间以来,我一直在努力思考它对每个人的工作方式,但我无法运行它。对我来说,我必须提交到master分支,然后才能够获得它。

为了使go使用特定的分支,提交ID或标记,您需要通过运行以下命令为go模块启用标志

转到en -w GO111MODULE = on

之后,我们将能够做

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

3

如果要将临时依赖项替换为本地目录(例如,如果同时使用两个模块),则可以replacego.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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.