为什么';";go供应商添加";使用修订号

为什么';";go供应商添加";使用修订号,go,dependency-management,govendor,Go,Dependency Management,Govendor,我遇到了一个编译错误,这让我相信我的供应商文件夹中的库版本是错误的。第一项任务是确定图书馆的哪个版本是正确的。我需要找到包含字符串“VolumeCreateRequest”的库源的版本。为此,我在库的根文件夹中使用了以下技巧: git rev-list --all | xargs git grep VolumeCreateRequest 从中我找到了版本哈希:06f160237426e705ed214a4f087d4aeea32c0a8b: 因此,我尝试将该版本添加到我的供应商文件夹中 go供

我遇到了一个编译错误,这让我相信我的供应商文件夹中的库版本是错误的。第一项任务是确定图书馆的哪个版本是正确的。我需要找到包含字符串“VolumeCreateRequest”的库源的版本。为此,我在库的根文件夹中使用了以下技巧:

git rev-list --all | xargs git grep VolumeCreateRequest
从中我找到了版本哈希:
06f160237426e705ed214a4f087d4aeea32c0a8b

因此,我尝试将该版本添加到我的供应商文件夹中
go供应商添加github.com/docker/docker/…@06f160237426e705ed214a4f087d4aeea32c0a8b

但它不起作用。当我使用git检查库的版本时,它不会报告我刚获取的版本

git log -n 1 --pretty=format:"%H"
vendor.json文件也包含错误的版本

怎么了?仔细阅读文档后,我看到go vender add只是默默地忽略了我获取URI末尾的
@06f160237426e705ed214a4f087d4aeea32c0a8b

正确的命令是go vendorfetch,它支持@version

govendor fetch github.com/docker/docker/…@06f160237426e705ed214a4f087d4aeea32c0a8b

实现这一点的另一种方法是在GOPATH(即不在供应商文件夹中)中git签出您想要的库版本,然后从GOPATH添加包

现在我检查了git版本,我们都很好。接着出现了下一个问题。我们的generate.go文件(由
go generate
调用)正在进入并用我的GOPATH上的内容覆盖我的
vendor.json
中所需的版本

我们的
generate.go
中的顺序是:

//go:generate govendor add +external
//go:generate govendor fetch +missing
//go:generate go vendor sync
这被证明是错误的,因为添加将覆盖我的更改,然后同步无效,因为vendor.json已经感染了错误的版本

正确的顺序如下:

//go:generate govendor sync
//go:generate govendor add +external
//go:generate govendor fetch +missing
这样,自定义的vendor.json将首先将vendor文件夹同步到所需的位置,然后才下载外部依赖项和缺少的依赖项

最后,有几个依赖项实际上根本不会编译成特定于平台的东西。为了解决这个问题,我在generate.go中添加了这些行,以便在同步、添加、获取之后删除那些已损坏的依赖项

//go:generate govendor remove github.com/docker/docker/runconfig
//go:generate govendor remove github.com/docker/docker/libcontainerd
//go:generate govendor remove github.com/docker/libcompose/test
//go:generate govendor remove github.com/Microsoft/...
相关博客文章:相关博客文章: