首页 > 解决方案 > 使用“go build”获取依赖项,即使它们在 vendor/

问题描述

我正在尝试获取一个 Go 项目并复制vendor/目录下的依赖项,以便在我的项目中拥有该项目的完整源代码及其依赖项。但是,即使在这样做之后,删除$GOPATH/pkg/mod并重建下的包也会导致 Go 编译器重新获取所有依赖项,这需要相当长的时间。

这就是我所做的:

# Fetch the project, e.g. influx/telegraf
go get -d github.com/influxdata/telegraf

# CD into the project
cd $GOPATH/src/influxdata/telegraf

# Fetch the modules under vendor/ directory
go mod vendor

调用最后一条命令后,Go 将获取pkg/mod. 不知道为什么要这样做,但我认为是因为它需要正常构建项目,然后将获取的依赖项移动到vendor/文件夹下。之后,我可以成功构建。但是,为了确保不再需要这些依赖项,我pkg/mod完全删除了该目录并重建了项目。出于某种原因,Go 编译器再次获取了包。

有什么我做错了吗?

谢谢!

标签: gogo-modules

解决方案


vendor文件夹并非在所有情况下都自动使用。

要确保从主模块的供应商文件夹加载依赖项,请传递-mod=vendor给 go 工具。

如果file指定的 go 版本为或更高,则该vendor文件夹(如果存在)仅自动使用(如果未使用 另有指定)。-mod=modgo.mod1.14

这些在Command go:Maintaining module requirements中有详细说明:

如果使用 -mod=vendor 调用,go 命令会从主模块的供应商目录加载包,而不是将模块下载到模块缓存中并从模块缓存中加载包。go 命令假定 vendor 目录包含正确的依赖项副本,并且它不会从 go.mod 文件中计算所需的模块版本集。但是,go 命令会检查 vendor/modules.txt(由“go mod vendor”生成)是否包含与 go.mod 一致的元数据。

如果使用 -mod=mod 调用,即使存在供应商目录,go 命令也会从模块缓存中加载模块。

如果 go 命令没有使用 -mod 标志调用并且供应商目录存在并且 go.mod 中的“go”版本是 1.14 或更高版本,则 go 命令将像使用 -mod=vendor 调用一样。


推荐阅读