主版本号后缀
从主版本号 2 开始,模块路径中必须添加一个像 /v2 这样的一个和主版本号匹配的后缀。举个例子如果一个模块在版本 v1.0.0 是的路径为 example.com/test,那么它在 v2.0.0 时的路径将是 example.com/test/v2。
主版本号后缀遵循导入兼容规则:
如果一个新代码包和老代码包拥有同样的导入路径,那么新包必须保证对老代码包的向后兼容。
根据定义,模块的新主版本中的包与先前主版本中的相应包不向后兼容。 因此,从 v2 开始,包需要新的导入路径。 这是通过向模块路径添加主版本后缀来实现的。 由于模块路径是模块内每个包的导入路径的前缀,因此将主版本后缀添加到模块路径可为每个不兼容的版本提供不同的导入路径。
主版本 v0 或 v1 不允许使用主版本后缀。 v0 和 v1 之间的模块路径不需要更改,因为 v0 版本为不稳定,没有兼容性保证。 此外,对于大多数模块,v1 向后兼容最新的 v0 版本, v1 版本才开始作为对兼容性的承诺。郑州心理咨询多少钱http://www.hyde8731.com/
这里有一个特例,以 gopkg.in/ 开头的模块路径必须始终具有主版本后缀,即使是 v0 和 v1 版本。 后缀必须以点而不是斜线开头(例如,gopkg.in/yaml.v2)。因为在 Go Modules 推出之前,gopkg.in 就沿用了这个规则,为了能让引入 gopkg.in 包的代码能继续导入编译, Go 做了一些兼容性工作。
主版本后缀可以让一个模块的多个主版本共存于同一个构建中。 这可以很好的解决钻石依赖性问题(diamond dependency conflict) https://jlbp.dev/what-is-a-diamond-dependency-conflict。 通常,如果传递依赖项在两个不同版本中需要一个模块,则将使用更高的版本。 但是,如果两个版本不兼容,则任何一个版本都不会满足所有的调用者。 由于不兼容的版本必须具有不同的主版本号,因此主版本后缀具有不同的模块路径,这样就不存在冲突了:具有不同后缀的模块被视为单独的模块,并且它们的包的导入路径也是不同的。
因为很多 Go 项目在迁移到 Go 模块之前就发布了 v2 或更高版本的版本,所以没有使用主要版本后缀。对于这些版本,Go 使用 +incompatible 构建标记来进行注释(例如,v2.0.0+incompatible)。