Module 依赖图修建
如果主模块在 go 1.17
或更高的版本中,用于最小版本选择的模块图只包括每个模块依赖的即时需求,在它自己的 go.mod
文件中指定 go 1.17
或更高,除非该模块的版本也被其他依赖在 go 1.16
或更低时所需要(过渡)。( go 1.17
依赖的过渡性依赖被*从模块图中删除)。
由于 go 1.17
go.mod
文件包括一个 require
指令,用于构建该模块中的任何软件包或测试所需的每一个依赖关系,所以精简后的模块图包括 go build
或 go test
任何依赖关系中主模块明确需要的所有依赖关系。一个模块如果*不需要构建任何包或在给定的模块中进行测试,就不能影响其包的运行时行为,所以从模块图中精简掉的依赖关系只会在其他不相关的模块之间造成干扰。
那些需求被删除的模块仍然出现在模块图中,并且仍然被 go list -m all
报告:它们的 版本选择 是已知的,并且定义得很好,包可以从这些模块加载(例如,作为从其他模块加载的测试的传递性依赖)。然而,由于 go
命令不能轻易识别这些模块的哪些依赖关系得到满足,go build
和 go test
的参数不能包括那些需求已被删除的模块的软件包。 go get
将包含每个指定软件包的模块提升为明确的依赖关系,允许在该软件包上调用 go build
或 go test
。
因为 Go 1.16 和更早的版本不支持模块图的修剪,完整的依赖关系的传递性闭合--包括传递性的 go 1.17
依赖关系--仍然包括每个指定 go 1.16
或更低的模块。(在 go 1.16
和更低的版本中,go.mod
文件只包括直接依赖关系,所以必须加载一个更大的图,以确保包括所有间接依赖关系。)
由 go mod tidy
为模块记录的 go.sum
文件默认包括 Go 版本所需的校验和,*比其 go
指令中指定的低版本。因此,go 1.17
模块包括 Go 1.16 加载的完整模块图所需的校验,但go 1.18
模块将只包括 Go 1.17 加载的剪枝模块图所需的校验。-compat
标志可以用来覆盖默认版本(例如,在 go 1.17
模块中更积极地精简 go.sum
文件)。
更多细节见设计文档。
懒模块加载
为模块图精简增加的更全面的要求也使得在模块内工作时有了另一个优化。如果主模块是在 go 1.17
或更高版本中,go
命令避免加载完整的模块图,直到(或除非)需要它。相反,它只加载主模块的go.mod
文件,然后尝试只用这些需求来加载要建立的包。如果要导入的包(例如,主模块以外的包的测试依赖)在这些需求中没有找到,那么模块图的其余部分就会被加载。
如果可以在不加载模块图的情况下找到所有导入的软件包, 则 go
命令会加载 仅 包含这些软件包的模块的 go.mod
文件, 并根据主模块的要求检查它们的要求,以确保它们在本地是一致的. (由于版本控制合并,手动编辑和使用本地文件系统路径 替换 的模块中的更改,可能会出现不一致性.)
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: