网上看了一些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