Go 语言在 go 1.6
版本以后编译 go 代码会优先从 vendor 目录先寻找依赖包,它具有以下优点:
- 复制依赖:go mod vendor 会把程序所依赖的所有包复制到项目目录下的vendor 文件夹中,所以即使这些依赖包在外部源(如 GitHub)中被删除或者更改,项目仍然可以稳定运行。
- 提升构建速度:构建应用时,Go 会首先在 vendor 目录中查找依赖。如果找到了所需的包,那么 Go 就会直接使用这个包,而不再去下载。
- 提升项目的可移植性:由于所有的依赖都被复制到了 vendor 目录中,所以可以很容易地把整个项目复制到新的环境,无需担心依赖问题。
然而,vendor 机制并不是一个完美的解决方案。它需要将所有的依赖都复制到 vendor 目录中,这可能会导致项目的大小变得非常大。另外,这可能会对代码审查和版本控制系统(如 Git)的性能产生负面影响。
因此,从Go 1.11版本开始,使用 Go Modules 进行依赖管理已经成为了推荐的做法,而vendor机制逐渐被淡化。不过,vendor目录并没有被完全废弃。