go - 使用“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 编译器再次获取了包。
有什么我做错了吗?
谢谢!
解决方案
该vendor
文件夹并非在所有情况下都自动使用。
要确保从主模块的供应商文件夹加载依赖项,请传递-mod=vendor
给 go 工具。
如果file指定的 go 版本为或更高,则该vendor
文件夹(如果存在)仅自动使用(如果未使用 另有指定)。-mod=mod
go.mod
1.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 调用一样。
推荐阅读
- c++ - Visual Studio C++ 中的错误代码 = 0x80070002
- elasticsearch - 弹性搜索是否使用以前的搜索频率?
- javascript - 使用 react-leaflet 渲染 TopoJSON
- ios - AppStore对应用多个版本号的审核
- java - 带有 limit(1) 的 Stream 评估流的每个元素
- elasticsearch - 如何存储有关用户已阅读哪些通知的信息?
- css - Gmail HTML 电子邮件覆盖的背景颜色
- r - 通过 XGBoost 交叉验证优化期间失败
- mysql - MYSQL 将字母等级映射到其等效值
- c# - 具有可变大小项目的 UWP ListView