• Golang 管理go类库版本


    golang

    之前介绍了如何使用github托管go类库,详见Golang 使用github托管go类库,接着上篇,本篇介绍go类库的版本管理。

    Go类库版本规则

    go类库版本的规则:主版本号.次版本号.修订号,其中:

    • 主版本号:类库进行了不可向下兼容的修改,例如功能重构,这时候主版本号往上追加;
    • 次版本号:类库进行了可向下兼容的修改,例如新增功能,这时候次版本号往上追加;
    • 修订号:类库进行了可向下兼容的修改(修改的规模更小),例如修复或优化功能,这时候修订好往上追加。

    Go类库发版示例

    同样以github.com/vsixz/common-go类库为示例。

    小版本升级

    主版本不升级,次版本或修订版本升级。

    v0.x.x版本升级至v1.x.x也是可以直接升级的。

    当前版本是v1.0.0,现对该类库进行了功能修改,发布v1.0.1版本:

    1、切换至release/1.x分支

    git checkout release/v1.x
    

    2、修改类库代码

    image-20210307164555890

    3、提交代码并发布

    git add .
    git commit -m "update hello"
    git push
    git tag v1.0.1
    git push --tags 
    

    4、使用demo-go测试,升级版本

    升级类库方式:

    • 使用go get -u xxx升级至该主版本号下最新版本;
    • 使用go get xxx@version升级至指定版本。
    $ go get - u github.com/vsixz/common-go
    go: downloading github.com/vsixz/common-go v1.0.1
    go: found github.com/vsixz/common-go/hello in github.com/vsixz/common-go v1.0.1
    go: github.com/vsixz/common-go upgrade => v1.0.1
    

    查看demo-go下的go.mod文件,确实升级到了新版本:

    image-20210307170252645

    5、运行测试

    $ go run main.go
    test hello:
    Hello, Jay
    common-go version: v1.0.1
    

    大版本升级

    主版本升级。

    值得注意的是,使用go get -u xxx升级类库版本时,无法跨主版本升级,只能升级至当前主版本下最新小版本;

    v0.x.x 升级至v1.x.x是个例外,可以直接使用go get -u xxx命令升级。

    当前版本是v1.0.1,现对该类库进行了功能重构,发布v2.0.0版本:

    1、继续按照最佳实践,创建2.x版本的分支

    git checkout -b release/v2.x
    

    2、在类库根目录下创建v2目录,并将当前项目go类库和go.mod全拷贝(或剪切)到v2目录

    image-20210307180521439

    3、修改module名称至新版

    go mod edit -module github.com/vsixz/common-go/v2 v2/go.mod
    

    查看v2/go.mod文件:

    image-20210307181944887

    修改了module名称后,如果v2目录下的go文件引用本类库的包,需要更新引用v2,否则无法找到引用包。

    4、v2类库新增功能

    image-20210307182055442

    5、提交代码并发布

    git add .
    git commit -m "refactor hello to v2"
    git push -u origin release/v2.x
    git tag v2.0.0
    git push --tags
    

    6、使用demo-go测试,升级版本

    注意,此时无法通过go get -u xxx升级至不同于当前主版本的最新版本,需要使用go get xxx@version升级:

    $ go get github.com/vsixz/common-go/v2@v2.0.0
    

    查看go.mod文件,已经添加了v2版本依赖包

    image-20210307191721725

    7、修改测试代码

    同时使用v1版本和v2版本的包函数:

    image-20210307191950971

    8、运行测试

    $ go run main.go
    test hello:
    Hello, Jay
    common-go version: v1.0.1
    Hello, Jay Chou
    common-go version: v2.0.0
    

    使用本地go类库

    如果本地的go类库暂未维护到远端,如何引用本地类库的包呢?

    在go.mod文件中使用replace引用本地go类库,这个方式有时候更方便于开发。

    common-go的module名称为github.com/vsixz/common-go

    replace使用go类库相对路径替换module的引用

    以下示例将go类库的引用切换为本地引用。

    image-20210307212245712

    由于是本地引用,版本号只需在主版本号的范围内即可。

    结束语

    主版本升级会给代码的维护和版本的维护增加难度,并且需要下游用户迁移版本。最好是当存在令人信服的原因时才对类库主版本进行升级,例如为了优化代码大规模重构。

    gzh

  • 相关阅读:
    Kafka 探险
    Semaphore 源码分析
    ReentrantLock 与 AQS 源码分析
    synchronized 原理分析
    ConcurrentHashMap 源码分析
    LinkedHashMap 源码分析
    HashMap 源码分析
    ArrayList 源码分析
    TCP 详解
    proxifier配合ss,实现全局代理
  • 原文地址:https://www.cnblogs.com/dpio/p/14496662.html
Copyright © 2020-2023  润新知