从v1.11开始Go添加了对模块的支持。命令
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
将是提交哈希?应该手工找到并输入这些信息,还是有更好的方法?
6条答案
按热度按时间4ktjp1zp1#
只需'去获取'你想要的提交哈希:
'go get'将正确更新依赖文件(go.mod,go.sum)。
更多信息:https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies
hgc7kmma2#
除了来自埃弗顿的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
文件中的伪版本,例如v0.0.0-20171006230638-a6e239ea1c69
(这有助于基于标准semver排序提供所有版本的简单总排序)。pcrecxhr3#
如果你想临时替换一个本地目录的依赖项(例如,如果你同时处理2个模块),你可以在
go.mod
文件的末尾添加replace
语句:qq24tv8q4#
我一直在敲打我的头一段时间,它是如何为每个人工作,我不能运行它。对我来说,我不得不提交到主分支,然后只有我能够得到它。
为了让go get能够使用特定的分支、提交id或标记,您需要通过运行下面的命令为go模块启用一个标志
go env -w GO111MODULE=on
在这之后我们就能
sigwle7e5#
另外,如果你在go.mod文件中用latest这个词代替标签,它将被修改为模块的latest标签。
例如:
将成为
运行
go mod tidy
后xv8emn3q6#
go get your-repo@branch-name
读取输出,并将go模块版本添加到require
或replace
:go list -m -json your-repo@branch-name | jq '.|"\(.Path) \(.Version)"'
jq
,请手动合并以下结果的Path
和Version
值:go list -m -json your-repo@branch-name
以空格分隔: