48

GVM - Go 的多版本管理工具,使用介绍

 5 years ago
source link: https://studygolang.com/articles/19285?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

原文作者: dryyun

原文链接: https://dryyun.com/2018/11/28...

基本介绍

项目地址

Go GitHub GVM GitHub

本机环境

设备 MacBook Pro

多版本管理使用场景

在 Mac 上使用 brew install go 真的很简单,一个命令就安装了最新版本的 Go,但是在实际使用过程中

  • 线上版本跟你本地版本不一样,你需要切换
  • 想尝试一下最新版本的 Go,但是实际开发还是不变
  • 其他语言都有 xxvm 工具,Go 也要来一个

以上,其实使用 docker 就能解决了,相比而言,我觉得直接切换版本是更轻量级的做法,除非你有同时开发几个项目,都使用不同版本的 Go 的经验。

brew 有一点不好就是不能安装旧版本的软件,不能安装旧版本的 Go,在切换 Go 版本上也略显麻烦,这个时候就要用到多版本管理了。

吐槽一下 brew 的升级,让我不能开心的切换 PHP 版本了,以前的 formula 有 php55,php56,php70,php71 ,都是独立的存在,只要 brew unlink,brew link 就可以了

使用

安装

bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) 如果使用的 zsh,那么把 bash 改成 zsh 即可

安装成功,会在家目录下增加 .gvm 的隐藏目录,并且在 .bashrc 或者 .zshrc 文件最底部增加一行

[[ -s "/Users/someone/.gvm/scripts/gvm" ]] && source "/Users/someone/.gvm/scripts/gvm"

命令

基于 GVM v1.0.22

特别说明

由于 Go 1.5 使用了自举,也就是用 Go 写 Go,如果在系统环境完全没有 Go 命令的情况下,使用 gvm install go 会报错,可以参考 gvm 文档相关说明 ,会要求先安装 Go 1.4,但是呢,对于高版本的 macOS 来说,安装 Go 1.4 是会失败的。

所以我的做法是使用 brew install go

先安装一个 Go,然后再使用 gvm 安装多版本,不过也只是建议安装 >= 1.5 的版本。

GVM 本质上就是 shell 脚本,而作者的文档写的也不尽如人意,如果对命令不了解,对命令不满意,完全可以进入 cd ~/.gvm/scripts ,查看、修改相应的命令。

比如查看各个命令的 help 帮助就很不同, gvm install - , gvm listall help , gvm use -h ,只能感慨作者 。

Usage: gvm [command]

Description:
  GVM is the Go Version Manager

Commands:
  version    - print the gvm version number
             - 打印 GVM 的版本
             
  get        - gets the latest code (for debugging)
             - 获取 GVM 最新的代码
             
  use        - select a go version to use (--default to set permanently)
             - 当前终端环境使用某个 go 版本,加上 --default 代表所有新打开的终端环境都使用这个版本
             - 查看帮助,`gvm use -h`
             
  diff       - view changes to Go root
             - ???
             
  help       - display this usage text
             - 显示帮助信息
  
  implode    - completely remove gvm
             - 彻底删除 gvm 和安装的所有 go 版本和包
             - 如果命令没用,那么删除 `rm -rf ~/.gvm` 目录,去掉 .bashrc 或者 .zshrc 的相关内容即可  
  
  install    - install go versions
             - 安装某个 go 的版本
             - 可以加上 tag, gvm install [tag],参考 https://github.com/golang/go/tags ,安装一些非稳定版本  
             - 查看帮助,`gvm install - `
             
  uninstall  - uninstall go versions
             - 卸载某个 go 版本
             
  cross      - install go cross compilers
             - 安装交叉编译器
             - gvm cross [os] [arch],os = linux/darwin/windows,arch = amd64/386/arm
  
  linkthis   - link this directory into GOPATH
             - 链接指定目录到 GOPATH 路径
             - 以个人使用来说,只要正确设置 GOPATH 就行,这个命令基本用不到,可以往下看 GOPATH 设置部分
             - 查看帮助,gvm linkthis -h
             - 吐槽,是不是缺了 unlink 命令。。
             
  list       - list installed go versions
             - 列出安装的 Go 版本
             
  listall    - list available versions
             - 列出可用的 Go 版本
             - 使用 `--all `,列出所有的 tags 
             - 查看帮助,gvm listall help
             
  alias      - manage go version aliases
             - 管理 Go 版本别名
             - gvm alias list ,列出所有别名
             - gvm alias create [alias name] [go version name],创建别名
             - gvm alias delete [alias name] ,删除别名
             - 个人感觉也基本用不到
             
  pkgset     - manage go packages sets
             - gvm pkgset [create/use/delete/list/empty] [pkgset name] 
             - 管理 GOPATHs 环境变量
             - 会在 `~/.gvm/environments` 目录下创建相应的文件
             - 吐槽,没有类似的 unuse 命令 
             
  pkgenv     - edit the environment for a package set
             - 编辑 pkgset 的环境变量
             - gvm pkgenv [pkgset name]

环境设置

通过 go env 可以查看当前设置的 Go 的环境。

其中 GOPATH 的设置,肯定是最重要的, 不过在 go 1.11 版本中,推出了 go module,好像弱化了 gopath 的作用

通过 gvm use [version] 切换 Go 的版本,也会更改相应的环境变量,其中就包括 GOPATH="/Users/someone/.gvm/pkgsets/go1.10.4/global"

那么问题来了,我每次切换版本,都会改变 GOPATH ,这在开发中很蛋疼,你可以看出有三个命令, linkthis , pkgset , pkgenv 都是跟环境变量有关的。

对我而言,这些命令都不用,承接上文中,再在 [[ -s "/Users/someone/.gvm/scripts/gvm" ]] && source "/Users/someone/.gvm/scripts/gvm" 这句话后面增加相应的环境变量就可以覆盖了。

GOPATH="xxxx"

GOBIN="$GOPATH/bin"

PATH=="$PATH:$GOBIN"


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK