go 版本管理分析

915 阅读2分钟

网上看了一些go版本管理的知识,感觉中文说明都太紧单,也没找到英文材料,试验了go的版本管理规则

引入样例: require github.com/firaga/loadgen-helper v0.0.0

默认如上引入分别为github repository名和 tag,v2.0.0打标签就行. 区别在go限制v2之上不能仅通过打标签设定版本. 需要修改mod文件,如改为github.com/firaga/loadgen-helper/v2

如果只修改了mod.没有修改module内的mod路径,包其实会出错.mod 这时会降级查找最高版本的可用包. 例如: mod 里引入v4.0.1: 之前

require (
	github.com/firaga/loadgen-helper/v4 v4.0.1
)

之后

require (
	github.com/firaga/loadgen-helper/v3 v3.0.1 // indirect
	github.com/firaga/loadgen-helper/v4 v4.0.1
)

代码也能跑起来,//indirect 也许起了作用

不一致也会报错. mod=v4 v4.0.0 存在 误写成v3的情况 require github.com/firaga/loadgen-helper/v3 v4.0.0

go: errors parsing go.mod:
/Users/firaga/Gode/loadgen/go.mod:5: require github.com/firaga/loadgen-helper/v3: version "v4.0.0" invalid: module contains a go.mod file, so major version must be compatible: should be v3, not v4

引入正确的包就能正常引入了

尝试在v4上打一个v3的标签

require github.com/firaga/loadgen-helper/v4 v3.1.0

报错

go: errors parsing go.mod:
/Users/firaga/Gode/loadgen/go.mod:5: require github.com/firaga/loadgen-helper/v4: version "v3.1.0" invalid: module contains a go.mod file, so major version must be compatible: should be v4, not v3

mod变为v4.0.2可用的最高版本,说明会对vX和版本号做校验

require github.com/firaga/loadgen-helper/v4 v4.0.2

下面尝试一下升版本造成方法不兼容的情况怎么处理 方法增加一个参数 之前

require github.com/firaga/loadgen-helper/v5 v5.0.0

引入成功但是报错

go: downloading github.com/firaga/loadgen-helper/v5 v5.0.0
# gopcp.v2/chapter4/loadgen
./gen.go:17:25: not enough arguments in call to log.DLogger
        have ()
        want (int)

看来和包引用缺少vX(应该可以理解为包错误的情况)处理不一样

在引入包中加入语法错误

require (
	github.com/firaga/loadgen-helper/v5 v5.0.2
)

引入成功,看来go mod 并不关心包是否正常,只是对mod和代码中v不同做了降级引用

最后尝试一下修改mod名和github不一致是否会有问题

module github.com/firaga/loadgen-helper/v5

改为

module github.com/firaga2/loadgen-helper/v5

引入忘改了

require github.com/firaga2/loadgen-helper/v5 v5.0.2
go: github.com/firaga2/loadgen-helper/v5@v5.0.2: reading github.com/firaga2/loadgen-helper/go.mod at revision v5.0.2: unknown revision v5.0.2

修改正确后

go: github.com/firaga2/loadgen-helper/v5@v5.0.3: reading github.com/firaga2/loadgen-helper/go.mod at revision v5.0.3: unknown revision v5.0.3

报错没变,应该是根据域名去寻找的,但这个报错很不明了

改成这样后

require github.com/firaga/loadgen-helper/v5 v5.0.3

返回

go: github.com/firaga/loadgen-helper/v5@v5.0.3: parsing go.mod:
	module declares its path as: github.com/firaga2/loadgen-helper/v5
	        but was required as: github.com/firaga/loadgen-helper/v5

mod name 和引入名称不能不一致

总结

module

  • go语言v2以上module包需要在mod文件中在名称后增加版本号v2(以下用v2表示),同时注意修改本包内的引用
  • 包名除v2部分要和线上地址保持一致,go语言会按uri寻找包.
  • 打tag时要和当前mod中的版本号保持一致,不然不能被其他包引入
  • mod name 增加v2后缀,但没有修改包中文件引用,引用此包的包会降级拉取最新可用包

主工程

  • 没有

最后总结下引入本地包的方法

require (
	github.com/firaga/loadgen-helper v1.0.2 // indirect
	github.com/firaga/loadgen-helper/v5 v5.0.0
)

replace github.com/firaga/loadgen-helper/v5 v5.0.0 => ./helper

也可以替换为线上包

require (
	github.com/firaga/loadgen-helper v1.0.2 // indirect
	github.com/firaga/loadgen-helper/v5 v5.0.0
)

replace github.com/firaga/loadgen-helper/v5 v5.0.0 => github.com/firaga/loadgen-helper/v2 v2.0.2