我升级到 go1.11 并且正在尝试使用 go 模块。我克隆了一个项目并运行 go build
,它创建了一个包含我所有依赖项的 go.mod
和 go.sum
文件。
现在我想提供文件,所以我运行命令 go mod vendor
不幸的是,mod vendor 使用旧版本的 go-bindata .我的项目无法构建,因为函数调用不存在。查看 vendored go-bindata
的源代码,我可以看到它与 go-bindata
项目的 master 分支中可用的不同。
在我的 go.mod
文件中有这个:
github.com/jteeuwen/go-bindata v3.0.7+incompatible
在我的 go.sum
文件中,有这个:
github.com/jteeuwen/go-bindata v3.0.7+incompatible h1:91Uy4d9SYVr1kyTJ15wJsog+esAZZl7JmEfTkwmhJts=
github.com/jteeuwen/go-bindata v3.0.7+incompatible/go.mod h1:JVvhzYOiGBnFSYRyV00iY8q7/0PThjIYav1p9h5dmKs=
在 GitHub 上,go-bindata
的最新标签是 master 分支上的 v3.0.7。
关于为什么 go mod
引用旧版本的任何想法以及我该如何解决这个问题。在另一台机器上,运行 go get -u https://github.com/jteeuwen/go-bindata
获取最新的项目。为什么 go mod
不做同样的事情?
编辑:
问题是 go mod
说它获得了 v3.0.7,但源代码与 Github 上当前可用的 3.0.7 标签不匹配。我在本地拥有的内容看起来像 v3.0.6,但被标记为 v3.0.7。
在Github上的版本中,有一个结构是这样的: link to source
type Config struct {
//... some other fields
NoMetadata bool
}
但在我的本地销售版本中,Config 结构没有 NoMetadata
字段。
看起来 go mod
使用的是旧标签,但认为它使用的是最新标签。
最佳答案
该存储库的最新标签是 v3.0.7,所以这就是 go mod
给你的。来自 the FAQ :
If a repository has not opted in to modules but has been tagged with valid semver tags (including the required leading v), then those semver tags can be used in a go get, and a corresponding semver version will be record in the importing module's go.mod file.
问题是您想要的代码不在 3.0.7 标记中,而是在 master 分支中吗?
查看更新中的特定 NoMetadata
字段,它已添加到 https://github.com/jteeuwen/go-bindata/commit/7f4fb1184ff6bab28016ed674b61864665ba3d97 中, 于 2015-08-13。同时,在 2014-11-20 标记了 v3.0.7
所以看起来您感兴趣的更改没有标记并且只在 master 分支上。
鉴于这种情况,您可以直接 fork 存储库——它自 2015 年以来一直没有维护(并且 README 承认它没有维护)。或者找到一些保持最新的东西。或者说服维护者创建一个新标签。
关于go mod vendors 旧版本的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54611118/