如何将go.mod中的Go模块依赖关系指向repo中的最新提交?

dim*_*mus 41 git module go

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

go mod init <package name>
go build
Run Code Online (Sandbox Code Playgroud)

将生成go.modgo.sum包含所有发现版本的软件包的依赖文件.

如果模块没有任何版本,则使用该模块的最新提交.如果某个模块确实有发行版,则会选择最新版本作为依赖项.

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

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

module /my/module

require (
...
github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe
...
)
Run Code Online (Sandbox Code Playgroud)

哪里v0.0.0不对应于上次发布的发布标记,20181121201909将是提交时间戳并且af044c0995fe是提交哈希?是否应该手工找到并输入此类信息,还是有更好的方法?

Eve*_*ton 62

只需"获取"您想要的提交哈希:

go get github.com/someone/some_module@af044c0995fe
Run Code Online (Sandbox Code Playgroud)

'go get'将正确更新依赖文件(go.mod,go.sum).

更多信息:https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies

  • OP 询问如何将其添加到 go.mod 文件,而不是如何执行“go get” (8认同)
  • 如果出现错误“**未知修订版**”或“**无效版本**” - 确保您没有指定 **PR 哈希值**(拉取请求)。即使是合并的 PR 也可能是错误的。在存储库中的“/commits”下查找提交哈希,但不在“/pulls”下查找。请在此处查看更多信息:[golang/go#31191](https://github.com/golang/go/issues/31191) 显式过滤掉此类提交。 (4认同)
  • @Nulik `go get` 是按照OP要求的方式更新/添加到 `go.mod` 的正确方法。 (4认同)
  • @cambraca你不能使用分支名称,如果它是过去的v1,否则你会得到“无效版本:go.mod具有v1后模块路径” (2认同)

typ*_*182 48

除了埃弗顿提供的有关获得特定提交的答案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排序在所有版本之间提供简单的总排序)。

  • 1. 将代码推送到 `github.com/fork/somelib` @ `dev` 分支 2. 修改 go.mod 文件,添加一行 `replace github.com/original/somelib =&gt; github.com/fork/somelib dev` 3.执行`go mod tidy`命令。完成这些后,go 会自动将 go.mod 中的 dev 替换为合适的伪版本。 (8认同)
  • 感谢您对伪版本的解释。我试图做一个`replace`来使用一些依赖的临时派生,但是找不到一种方法来进行替换以指向一些提交。不得不创建一个版本标签并像这样指定它(替换github.com/original/somelib =&gt; github.com/fork/somelib v1.2.3),当我只想快速测试内容时,这有点太多了。替换github.com/original/somelib =&gt; github.com/fork/somelib@commithash和替换github.com/original/somelib =&gt; github.com/fork/somelib commithash不起作用 (2认同)

Ser*_*kov 15

  • 从分支读取输出下载源代码
    go get your-repo@branch-name ,并添加要添加的 go 模块版本requirereplace
    go:下载 github.com/your-repo v1.2.3-0.20210609123456-123123123
  • 稍后可以在以下命令的输出字符串中找到此版本
    go list -m -json your-repo@branch-name | jq '.|"\(.Path) \(.Version)"'
  • 如果jq您的 PC 上未安装 - 手动组合Path结果Version值:
    go list -m -json your-repo@branch-name
    以空格分隔:
    your-repository v1.2.3-0.20210609123456-123123123


Cha*_*ari 12

一段时间以来,我一直在思考它如何适用于每个人,但我无法运行它。对我来说,我必须提交到 master 分支然后才能够得到它。

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

去 env -w GO111MODULE=on

在此之后,我们将能够做到

go get repo@branchname
go get repo@tag
go get repo@commithash
Run Code Online (Sandbox Code Playgroud)


dim*_*mus 11

如果您想临时替换本地目录的依赖项(例如,如果您同时处理 2 个模块),您可以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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我试图使用远程模块分支测试一个项目,因为我不知道可以定位本地目录。 (2认同)

小智 5

此外,如果您在 go.mod 文件中将单词 latest 替换为标签,它将被更改为模块的最新标签。

例如:

module /my/module

require (
...
github.com/someone/some_module latest
...
)
Run Code Online (Sandbox Code Playgroud)

会变成

module /my/module

require (
...
github.com/someone/some_module v2.0.39
...
)
Run Code Online (Sandbox Code Playgroud)

跑完后 go mod tidy