The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
Twelveeee

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

  •  
  •   Twelveeee ·
    Twelveeee · Feb 28, 2025 · 4783 views
    This topic created in 618 days ago, the information mentioned may be changed or developed.

    新老项目很多,怎么进行 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 replies  •  2025-03-01 17:10:36 +08:00
    mengyx
    mengyx
    Feb 28, 2025 via iPhone❤️1
    1
    go.mod 里面添加一行 toolchain go1.24.0 不就能自动切换了吗?
    strobber16
    strobber16
    Feb 28, 2025
    2
    没听懂,你是在用 go1.20 的编译器,引用 1.21 目录里的标准库 maps 来编译吗?你这么做的目的是啥?
    lesismal
    lesismal
    Feb 28, 2025
    3
    我个人:

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

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

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

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

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

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

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

    ![img]( https://upload.cc/i1/2025/03/01/guMEbH.png)
    Cannian
    Cannian
    Mar 1, 2025
    24
    @povsister 造轮子的时候就要降版本号了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4447 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 09:11 · PVG 17:11 · LAX 01:11 · JFK 04:11
    ♥ Do have faith in what you're doing.