【发布时间】:2020-05-18 22:46:25
【问题描述】:
所以我有一个项目,我想使用一些 Docker CLI 代码。它使用模块。 Docker CLI 没有。
奇怪的是,在某些时候我有这个工作,但我不得不切换分支,现在我无法让它再次构建。
我的 go.mod 看起来像这样:
go 1.13
require (
github.com/docker/cli v0.0.0-20200129215115-2079e743c493
github.com/docker/docker v1.13.1 // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/imdario/mergo v0.3.8 // indirect
github.com/mattn/go-shellwords v1.0.9 // indirect
github.com/pelletier/go-toml v1.6.0 // indirect
github.com/sirupsen/logrus v1.4.2
github.com/spf13/afero v1.2.2 // indirect
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/cobra v0.0.5
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.6.1
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
golang.org/x/sys v0.0.0-20200116001909-b77594299b42 // indirect
golang.org/x/text v0.3.2 // indirect
gopkg.in/ini.v1 v1.51.1 // indirect
gopkg.in/yaml.v2 v2.2.7
gotest.tools v2.2.0+incompatible // indirect
)
我尝试过删除供应商目录,我尝试过删除 $(go env GOCACHE),我什至尝试过删除 pkg/mod 目录。我尝试过使用和不使用 -mod=vendor 进行构建。我什至尝试过使用 Dockerfile 构建,有无 --no-cache。
每次结果都是一样的:
github.com/docker/cli/opts/config.go:15:12:未定义:swarm.ConfigReference
但是,这让我感到困惑,这不是它在第 15 行的任何版本的 opts/config.go 上所说的。它说 swarmtypes 而不是 swarm 这是正确的。在项目目录中搜索swarm.ConfigReference 不会产生任何结果。我还尝试为 config.go grepping go build 的 strace 输出,除此错误外没有其他结果。编辑:实际上 strace 截断了路径, go build 确实打开了文件。但是我在显示打开的绝对路径处检查文件中的第 15 行,它显示 swarmtypes 而不是 swarm。
go build 从哪里获取此代码?
编辑:已修复,因为 go build 报告的是实际类型而不是导入别名,所以我正在追赶鬼魂。感谢下面的彼得。
作为参考,这实际上是构建的(注意它使用了一个从不版本的 docker/docker):
require (
github.com/containerd/containerd v1.3.2 // indirect
github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492
github.com/docker/distribution v2.7.1+incompatible // indirect
github.com/docker/docker v1.4.2-0.20200201180422-513b207b002d // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/imdario/mergo v0.3.8 // indirect
github.com/mattn/go-shellwords v1.0.9 // indirect
github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
github.com/opencontainers/image-spec v1.0.1 // indirect
github.com/pelletier/go-toml v1.6.0 // indirect
github.com/sirupsen/logrus v1.4.2
github.com/spf13/afero v1.2.2 // indirect
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/cobra v0.0.5
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.6.1
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
golang.org/x/sys v0.0.0-20200116001909-b77594299b42 // indirect
golang.org/x/text v0.3.2 // indirect
gopkg.in/ini.v1 v1.51.1 // indirect
gopkg.in/yaml.v2 v2.2.7
gotest.tools v2.2.0+incompatible // indirect
)
【问题讨论】:
-
请指出哪个库具有您所指的源文件。您可以尝试使用相应的标签(您在 go.mod 中指定)从 github 中检出该库,然后检查该文件的行是否正确。
-
我添加了更多路径。完整的路径显然取决于它是取自 pkg/mod 还是供应商,这并不重要,结果明智。问题是该项目没有使用语义版本标签,go mod 中的版本是添加 master 时 go 的版本。
-
swarmtypes 是 package swarm at docker/docker/api/types/swarm 的别名(参见 config.go 中的 import 语句)。错误消息使用规范的包名称,仅此而已。您必须找到该软件包的兼容版本才能成功构建。
-
啊……这很有道理。我确实注意到了导入别名,但错误地认为错误消息应该使用别名(可以说它应该使用)。我还在纳闷为什么要在上周编译,但至少我不会再追鬼了。谢谢:)
标签: docker go go-modules