问题1:什么是go.mod以及它是用来解决什么问题的?
go mod
是 Go 语言引入的包管理工具,用于解决 Go 语言项目在依赖管理方面的问题。
传统上,若不使用go mod,则需要要通过GOPATH来管理依赖,而这种方式存在一些问题:
如1. 包管理依赖不明确
2. 依赖库的版本管理
3. 需要手动管理同步依赖的复杂性等
而go mod可以帮助开发者在项目中明确管理依赖的版本、自动下载依赖、提供依赖版本的更新与回退等功能,从而改善Go语言的包管理体验。
类似于其他语言中,如JAVA则采用maven来管理依赖、Python的pip以及PHP的Composer等。
问题2:go.sum的作用以及为什么要把go.mod和go.sum分开
为了确保一致性构建,Go引入了go.mod文件通过哈希值来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。
考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构建。
为了解决Go module的这一安全隐患,Go开发团队在引入go.mod的同时也引入了go.sum文件,用于记录每个依赖包的哈希值。
在构建时,如果本地的依赖包hash值与go.sum文件中记录得不一致,则会拒绝构建。
因此,该文件记录了每个依赖模块的校验和,用于确保依赖的安全性和可重现性。在执行 go build
或 go run
时,Go 会检查 go.sum
文件以确保依赖的完整性。
同时,由于这两个文件分别负责不同的分工:区分模块信息和依赖校验信息,来确保项目的依赖管理的准确性和安全性,要把它们放在不同的文件。