我已经升级了项目以使用go 1.11.2模块支持。但是,我遇到了一个非常烦人的问题。go.mod文件的CI不断变化。每天都有不同的文件。今天,go.sum中的行是:
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd h1:HuTn7WObtcDo9uEEU7rEqL0jYthdXAmZ6PP+meazmaU= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
go.mod是:
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd // indirect
我没有更新任何依赖项。他们没有锁!为什么不?如果依赖关系不断变化,这将是一个很大的问题。但是,我看不到其他人对此问题大喊大叫。所以我一定做错了。
我正在使用go mod tidy之前将其同步git diff --exit-code。这在本地有效,但不适用于Travis- CI。我认为这是一个问题,因为在Travis- CI上它需要获取依赖项,并且由于这些依赖项不使用语义版本控制,因此Go可以获取最新的,每次提交到master时都会更改。如果您同意这是问题所在,那么如何锁定Go模块的依赖关系?
go mod tidy
git diff --exit-code
Wiki解释了如何使用尚未选择go模块的软件包
以下是相关片段:
如果存储库没有任何有效的semver标记,则该存储库的版本将使用“伪版本”记录,例如v0.0.0-20171006230638-a6e239ea1c69(其中包括时间戳和提交哈希,并且旨在允许go.mod中记录的各个版本之间的总排序,以便更容易地推断出哪个记录版本比另一个记录版本“晚”。
您也可以指定require提交哈希值:
require
如果需要,可以使用诸如go get foo@v1.2.3,go foo @ master,go foo @ e3702bed2之类的命令或通过直接编辑go.mod来选择更特定版本的依赖项。