在软件构建中,我们经常看到”vendor”,或者”vendored”这个词。vendor本身指的是供应商,也即第三方依赖的提供者,比如git,ssh等。而vendoring,是指捆绑,或者内部引入,也即像对待自己的代码一样对待供应商提供的代码。我们不再仅仅以来外部包管理器或系统环境来提供这些依赖,而是将它们的精确副本拷贝到本地项目中。
Vendoring 的优缺点
Vendoring 是一个权衡的过程,旨在解决特定的开发和部署挑战:
优点
- 构建可重复性: 确保无论在哪里构建项目,使用的依赖项版本都是完全一致的,避免了“在我的机器上可以运行”的问题。
- 可靠性和稳定性: 不依赖外部服务器(如 npm 或 PyPI 仓库)的可用性。即使原始依赖项的托管服务出现故障或依赖项突然被删除,您的构建也不会中断。
- 离线构建: 可以在没有网络连接的环境中进行构建,因为所有必需的源代码都在本地。
- 版本冲突控制: 避免您的项目所需的特定版本与用户机器上的其他软件所需的版本发生冲突。
- 安全性审查和补丁: 允许您在提交前自行审查和修补依赖项中的安全漏洞,而无需等待上游供应商发布修复版本。
缺点
- 代码库膨胀: 将大量第三方代码添加到您的仓库中会显著增加仓库大小,延长克隆和拉取时间。
- 更新维护负担: 您需要负责监控、测试和手动合并上游依赖项的安全更新和错误修复。
- 许可证合规性挑战: 管理和遵守所有捆绑依赖项的许可证要求变得更加复杂。
- 重复代码: 多个项目可能会包含相同的依赖项副本,浪费存储空间。
总之,vendored 选项提供了一种将外部依赖项“内部化”的机制,以换取更高的构建稳定性和控制力。