Go模块是从Go 1.11+引入的标准依赖管理机制。主要文件为go.mod(定义最小依赖及其版本)和go.sum(通过哈希保证完整性)。
添加依赖的命令是:
go get github.com/pkg/errors@v0.9.1
更新依赖的命令是:
go get -u ./... go mod tidy # 删除未使用的依赖
Go支持语义版本控制(semver),依赖项是严格锁定的:项目是可重现的,构建是确定性的。但需要注意:
如果删除文件go.sum并运行命令go build,会发生什么?这有什么危险?
许多人认为Go会从头重新构建依赖项。但是,文件go.sum包含所有使用模块的哈希,并保护不受篡改(供应链攻击)。如果删除该文件,
在下次构建时,Go会重新下载依赖项,重新生成文件,但如果依赖的代码库被恶意者更改,保护机制就会失效!可能会导致生产环境代码的替换。
故事
在一个大型项目中,代码库从vendoring迁移到go模块,忘记锁定版本。一个月后,第三方包的更新破坏了兼容性,导致无法构建旧分支——代码失去了可重现性。
故事
在另一个项目中,开发人员意外删除了go.sum。在重新启动后,团队注意到部分依赖项发生了变化,出现了与次要版本不兼容的错误——因此回滚了几天。
故事
在本地目录上使用替换路径(replace ... = ../some/library)在部署前未被删除——在CI/CD管道中,构建失败,因为外部系统无法访问本地文件,而生产环境被“固定”在错误的版本上。