V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Twelveeee
V2EX  ›  Go 编程语言

各位大佬们怎么进行 golang 项目的多版本控制?

  •  
  •   Twelveeee ·
    Twelveeee · 31 天前 · 2562 次点击

    新老项目很多,怎么进行 golang 的版本控制?

    这边推荐两个库(非推广)

    golang 多版本 下载删除 管理 https://github.com/fsgo/smart-go-dl

    自动切换 go 执行的二进制文件 https://github.com/fsgo/bin-auto-switcher

    效果如图

    bin-auto-switch go 版本是 go1.22

    ddns-go go 版本是 go1.20

    直接运行 go 命令就能直接使用

    image-20250228191747816

    image-20250228191902509

    除此之外,vscode goroot 的配置我感觉是有问题的,哪怕我配置了 go.root 为 1.21 的目录 ,只要我默认的版本是 go1.20 ,那么我的 maps 就一直会报错(maps 为 go1.21 新增)

    bin-auto-switch 本质是替换了 go 的命令,然后通过读取各种配置,比如 go.mod 去判断应该执行的 go 的版本

    自从用了 bin-auto-switch 之后,除了牺牲执行时的一些性能损耗,用起来非常丝滑,代码提示和代码跳转都没有问题,都能自动切到对应的版本。

    最后,俺的博客 https://blog.twelveeee.top/2025/Go/go_version_control/ 记录了这两个项目的用法(虽然这两个项目的 readme 都很完整)(涨涨 pv 谢谢!)

    24 条回复    2025-03-01 17:10:36 +08:00
    mengyx
        1
    mengyx  
       31 天前 via iPhone   ❤️ 1
    go.mod 里面添加一行 toolchain go1.24.0 不就能自动切换了吗?
    strobber16
        2
    strobber16  
       31 天前
    没听懂,你是在用 go1.20 的编译器,引用 1.21 目录里的标准库 maps 来编译吗?你这么做的目的是啥?
    lesismal
        3
    lesismal  
       31 天前
    我个人:

    1. 本地 go 用最新
    2. 很少用新版新特性
    3. 如果需要测试,命令行走起,https://go.dev/doc/manage-install
    Twelveeee
        4
    Twelveeee  
    OP
       31 天前
    @mengyx 那我这半年吃过的苦算什么 TAT
    Twelveeee
        5
    Twelveeee  
    OP
       31 天前
    @strobber16 @lesismal

    主要是 golang 版本和项目的版本不对的话,vscode 会报错并且没有代码提示和跳转

    正常运行命令 go1.21 run main.go 还是能运行的,开发起来比较痛苦。
    thevita
        6
    thevita  
       31 天前
    管理 本地工具链吗?, asdf 啊
    povsister
        7
    povsister  
       31 天前   ❤️ 2
    啊? java 的裹脚布传统也要带过来吗

    go 版本难道不是有新的就升?哦,字节跳动除外。
    stormtrooperx5
        8
    stormtrooperx5  
       31 天前
    有这个必要吗?部署都是用 docker ,要用什么版本 dockerfile 里面指定就行了,啥时候打不出包了就看看日志换个 build image
    dong568789
        9
    dong568789  
       31 天前
    vscode 指定 "GOROOT": "\\toolchain@v0.0.1-go1.22.7.windows-amd64"
    headwindx
        10
    headwindx  
       31 天前 via iPhone
    用 asdf 吧,自己多去研究下
    inhzus
        11
    inhzus  
       31 天前 via iPad
    用 mise ,更快版本的 asdf
    Maboroshii
        12
    Maboroshii  
       31 天前 via Android
    我用的 gvm 。不过一般本地用最新的
    RobinHuuu
        13
    RobinHuuu  
       30 天前 via iPhone
    update-alternative??
    sardina
        14
    sardina  
       30 天前 via iPhone
    go 兼容性那么好,不用新的傻吗,赶紧升级 1.24map 性能有优化
    zachli
        15
    zachli  
       30 天前
    有些要支持 win7 或 2008 ,不得不 1.20 吧
    zachli
        16
    zachli  
       30 天前
    @mengyx 用 go1.20 的,添加这句不行吧
    mengyx
        17
    mengyx  
       30 天前   ❤️ 2
    @zachli go1.21 新增的功能,需要本机安装的版本在 1.21 或以上才能识别这个指令,代表本模块所需使用的工具链

    也可以用 GOTOOLCHAIN=go1.18 go run . 强行指定编译使用的版本

    详情可见: https://go.dev/blog/toolchain
    BeautifulSoap
        18
    BeautifulSoap  
       30 天前 via Android   ❤️ 1
    go 这种升个版本和喝水一样的东西对多版本管理要求倒也没那么大。我们公司 go 有的项目最新版的大版本一出本地和开发测试环境就原地升到最新版,然后过个半年左右生产环境也升到最新版。小版本基本上是公布后有人注意到生产环境就顺便升了
    0x676e67
        19
    0x676e67  
       30 天前
    👀又不是 java ,golang 随便升啊
    Twelveeee
        20
    Twelveeee  
    OP
       30 天前
    感谢各位大佬,学到了!
    Twelveeee
        21
    Twelveeee  
    OP
       30 天前
    至于为什么不升级 go 的版本,有些项目不是我们团队负责的,我就上去加一两行代码。

    升级完了 golang 版本还要去改 makefile ,还要担心上线出了问题,所以还是保留原状,不升的好。
    neoblackcap
        22
    neoblackcap  
       30 天前
    没记错,golang 是高版本向下兼容的,而且编译方式都是静态编译,相当于基本上所有依赖都是有源码。直接升工具链没啥问题吧
    skiy
        23
    skiy  
       30 天前
    好主意。回头我实现一下我写的 GVM 工具。加个 switch

    ![img]( https://upload.cc/i1/2025/03/01/guMEbH.png)
    Cannian
        24
    Cannian  
       30 天前
    @povsister 造轮子的时候就要降版本号了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:28 · PVG 03:28 · LAX 12:28 · JFK 15:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.