0%

如何将你的 golang 库升级到 v2 版本

如果你用到了一个库的 v2 版本,你依赖的另外一个库用到了该库的 v1 版本,而二者不兼容,该如何处理呢?

我之前在用到比如 github.com/urfave/cli/v2github.com/go-playground/validator/v10 这种库时,经常会看到一个库可以有多个版本,方便做版本的升级。

golang 本身在 1.13 版本后支持通过 go mod 的方式,引入同一个包的不同版本,防止出现交叉引用时出现的不兼容情况。

项目的 v1 版本

app.go

1
2
3
4
5
package mod

func Version() string {
return "v1"
}

go.mod

1
module github.com/phpcyy/mod

将项目打上 tag v1.0.0 并发布。

项目的 v2 版本

app.go

1
2
3
4
5
package mod

func Version() string {
return "v2"
}

go.mod

1
module github.com/phpcyy/mod/v2

将项目打上 tag v2.0.0 并发布。

测试

在另外一个项目中,执行 go get github.com/phpcyy/mod
go get github.com/phpcyy/mod/v2 来引入不同版本的库。

1
2
3
4
5
6
7
8
9
10
11
12
package main

import (
"fmt"
"github.com/phpcyy/mod"
mod2 "github.com/phpcyy/mod/v2"
)

func main() {
fmt.Println(mod.Version())
fmt.Println(mod2.Version())
}

打印显示

1
2
v1
v2

这样便可以做到在一个项目中引入一个库的不同版本。

具体代码见于 github.com/phpcyy/mod,可以作为一个小示例。