构建期间的模块依赖缓存问题

Module dependency caching issue during build

最近切换到使用 Go 1.11 版本,并且正在尝试将我们的项目转换为使用新的模块系统。但是,我 运行 遇到了缓存系统的一个令人沮丧的问题(由于过去不相关的问题,我到目前为止 运行 和 GOCACHE=off ,但这不是一个选项模块)。

以下命令日志基于使用我的系统的全新升级使用 Homebrew 转到 1.11(我通常使用 gvm 来安装和管理 Go 版本,但为此切换到系统构建以查看 gvm 是否是问题所在).我将我的 GOPATH 设置为一个临时目录,并将源代码移出了默认的 GOPATH(它当前位于 ~/gotemp/statsbot)。

对于此命令日志,我首先对缓存进行核对,以使其处于全新状态。然后我正在进行构建(以引入任何缺少的依赖项,这也应该重新缓存 deps),然后对其中一个子目录进行测试。

[08:34:48] statsbot (feature/bot-rebuild-gomod) $ rm -rf on

[08:34:49] statsbot (feature/bot-rebuild-gomod) $ go clean --cache

[08:34:50] statsbot (feature/bot-rebuild-gomod) $ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="on"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/var/folders/ck/bf8_n8hn34j7bh7hqqppxrtm0000gn/T/tmp.3ga5Iq09"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.11/libexec"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.11/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/kaedys/gotemp/statsbot/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/ck/bf8_n8hn34j7bh7hqqppxrtm0000gn/T/go-build065167780=/tmp/go-build -gno-record-gcc-switches -fno-common"

[08:34:53] statsbot (feature/bot-rebuild-gomod) $ go build .

[08:35:01] statsbot (feature/bot-rebuild-gomod) $ ginkgo stats
Failed to compile stats:

# golang.org/x/text/runes
/var/folders/ck/bf8_n8hn34j7bh7hqqppxrtm0000gn/T/tmp.3ga5Iq09/pkg/mod/golang.org/x/text@v0.3.0/runes/cond.go:10:2: can't open import: "golang.org/x/text/transform": open on/51/51b9b2cf5a27a7ff06942814ad6ef031de64dc6d773c835916067578ea1ae3a1-d: no such file or directory
# golang.org/x/text/encoding
/var/folders/ck/bf8_n8hn34j7bh7hqqppxrtm0000gn/T/tmp.3ga5Iq09/pkg/mod/golang.org/x/text@v0.3.0/encoding/encoding.go:19:2: can't open import: "golang.org/x/text/encoding/internal/identifier": open on/4c/4c2fad64312f6ec34b38755ccecb96bb31c6995211f39e0eb4112abc2fac560c-d: no such file or directory
# gopkg.in/fsnotify.v1
/var/folders/ck/bf8_n8hn34j7bh7hqqppxrtm0000gn/T/tmp.3ga5Iq09/pkg/mod/gopkg.in/fsnotify.v1@v1.4.7/kqueue.go:18:2: can't open import: "golang.org/x/sys/unix": open on/77/77790588f9aed90a52efdb1dac069953e1ea2bf82db8627a47a9492862b39c6e-d: no such file or directory

Ginkgo ran 1 suite in 4.123499564s
Test Suite Failed

我在许多构建情况下都看到了同样的错误消息。 go build . 通常 会成功,但有时会失败并显示类似的消息。 运行 go clean --cache 总是修复这些问题,但我真的不想 运行 在每次构建之前,它 不会 工作尝试使用 Ginkgo 进行测试,因为这似乎涉及多个连续的编译。

错误本身令人费解,因为这些文件 do 存在:

[08:40:49] statsbot (feature/bot-rebuild-gomod) $ ll on/4c
total 112
-rw-r--r--  1 kaedys  staff  18346 Sep 14 08:40:19 2018 4c1d5db302dff0381c402160d7fd2bd89a6dafd3edc61b3dbd5e8f1a85108fb7-d
-rw-r--r--  1 kaedys  staff  27980 Sep 14 08:40:45 2018 4c2fad64312f6ec34b38755ccecb96bb31c6995211f39e0eb4112abc2fac560c-d
-rw-r--r--  1 kaedys  staff    175 Sep 14 08:40:20 2018 4cbbc40c46eba0ef41f3ebd23470c3327215fa6e05e269c276c6635da79f2e8e-a
-rw-r--r--  1 kaedys  staff     13 Sep 14 08:40:20 2018 4cffcbd4a7f1255ca3696f5e24e0b1045d14c25f1f90cbbb077b5d6f2d11e68c-d

ll 中的第二个文件是第二条错误消息所抱怨的文件丢失的文件,所以我只能假设它在文件仍在生成时试图访问该文件,或者它正在寻找不同的目录(这很难说,因为错误消息只报告文件的相对路径)。

在 Go 上创建官方问题之前,在此处发帖看看是否有人知道如何解决这个问题,或者在我的环境设置中是否有问题 github。

您的 GOCACHE 环境变量设置为 "on"GOCACHE 的值必须是一个文件夹,特殊的 "off" 值意味着不缓存构建和测试结果并且不使用那些已经缓存的数据。没有特殊值"on".

您不必设置 GOCACHE,因为它有默认值。引用自 Command Go: Build and test caching:

The go command caches build outputs for reuse in future builds. The default location for cache data is a subdirectory named go-build in the standard user cache directory for the current operating system. Setting the GOCACHE environment variable overrides this default, and running 'go env GOCACHE' prints the current cache directory. You can set the variable to 'off' to disable the cache.