当前位置: 首页 > 工具软件 > GVM_ > 使用案例 >

go gvm_使用GVM管理多个版本的Go

马浩淼
2023-12-01

go gvm

Go Version Manager( GVM )是用于管理Go环境的开源工具。 它支持安装Go的多个版本,并使用GVM“ pkgsets”在每个项目中管理模块。 GVM由Josh Bussdieker最初开发,GVM(类似于Ruby的RVM)使您可以为每个项目或项目组创建一个开发环境,将不同的Go版本和程序包依赖项隔离开来,以提供更大的灵活性并防止版本问题。

安装GVM

安装GVM很简单。 GVM存储库安装文档指示您下载安装程序脚本并将其通过管道传输到Bash:

 bash < < ( curl -s -S -L https: // raw.githubusercontent.com / moovweb / gvm / master / binscripts / gvm-installer ) 

尽管越来越多地采用这种安装方法,但在执行安装之前请先了解一下安装程序的工作仍然是一个好习惯。 对于GVM,安装程序脚本为:

  1. 检查一些依赖
  2. 克隆GVM存储库
  3. 使用Shell脚本执行以下操作:
    • 安装Go
    • 管理GOPATH环境
    • 在您的bashrc,zshrc或个人资料中添加一行

如果要仔细检查它在做什么,则可以克隆该存储库并查看shell脚本,然后运行./binscripts/gvm-installer以使用本地脚本进行设置。

注意:由于可以使用GVM下载和编译新的Go版本,因此存在一些预期的依赖项,例如Make,Git和Curl。 您可以在GVM的README中找到完整的发行列表。

使用GVM安装和管理Go版本

安装GVM后,您就可以开始使用它来安装和管理不同版本的Go。 gvm listall命令显示可以下载和编译的可用Go版本:


   
   
[ chris @ marvin ] $ gvm listall
$ gvm listall

gvm gos ( available )

   go1
   go1.0.1
   go1.0.2
   go1.0.3

< output truncated >

安装特定的Go版本就像gvm install <version>一样容易,其中<version>gvm listall命令返回的版本之一。

假设您正在使用Go版本1.12.8的项目中工作。 您可以使用gvm install go1.12.8进行安装


   
   
[ chris @ marvin ] $ gvm install go1.12.8
Installing go1.12.8...
  * Compiling...
go1.12.8 successfully installed !

输入gvm list ,您会看到Go版本1.12.8与系统Go版本(使用操作系统的软件包管理器打包在一起的版本)一起安装:


   
   
[ chris @ marvin ] $ gvm list

gvm gos ( installed )

   go1.12.8
= > system

GVM仍在使用Go的系统版本,由其旁边的=>符号表示。 您可以通过gvm use命令将环境切换为使用新安装的go1.12.8:


   
   
[ chris @ marvin ] $ gvm use go1.12.8
Now using version go1.12.8

[ chris @ marvin ] $ go version
go version go1.12.8 linux / amd64

GVM使管理Go的已安装版本变得极其简单,但是变得更好!

使用GVM pkgset

Go开箱即用,具有出色且令人沮丧的管理软件包和模块的方式。 默认情况下,如果您获得软件包,则将其下载到$ GOPATH中srcpkg目录中; 然后可以使用import将其包含在Go程序中。 这使得获取软件包(特别是对于非特权用户)变得容易,而无需sudo或root特权(就像Python中的pip install --user一样)。 但是,要权衡的是在不同项目中管理同一软件包的不同版本的困难。

有很多方法可以尝试解决或缓解该问题,包括实验性Go模块(Go v1.11中添加了初步支持)和go dep (“官方实验”以及Go模块的替代方案)。 在发现GVM之前,我将在自己的Docker容器中构建和测试Go项目以确保隔离。

GVM通过使用“ pkgsets”将项目的新目录附加到安装的Go版本的默认$ GOPATH上 ,优雅地完成了项目之间的软件包管理和隔离,就像$ PATH在Unix / Linux系统上工作一样。

最简单的方法是将其可视化。 首先,安装新版本的Go v1.12.9:


   
   
[ chris @ marvin ] $ echo $GOPATH
/ home / chris / .gvm / pkgsets / go1.12.8 / global

[ chris @ marvin ] $ gvm install go1.12.9
Installing go1.12.9...
  * Compiling...
go1.12.9 successfully installed

[ chris @ marvin ] $ gvm use go1.12.9
Now using version go1.12.9

告诉GVM使用新版本时,它将更改为新的$ GOPATH ,它对应于该版本的默认gloabl pkgset:


   
   
[ chris @ marvin ] $ echo $GOPATH
/ home / chris / .gvm / pkgsets / go1.12.9 / global

[ chris @ marvin ] $ gvm pkgset list

gvm go package sets ( go1.12.9 )

= >  global

使用默认版本的Go的任何项目都可以使用全局pkgset中的软件包,尽管默认情况下没有安装额外的软件包。

现在,假设您正在启动一个新项目,并且它需要一个特定的程序包。 首先,使用GVM创建一个名为introToGvm的新pkgset


   
   
[ chris @ marvin ] $ gvm pkgset create introToGvm

[ chris @ marvin ] $ gvm pkgset use introToGvm
Now using version go1.12.9 @ introToGvm

[ chris @ marvin ] $ gvm pkgset list

gvm go package sets ( go1.12.9 )

    global
= >  introToGvm

如上所述,pkgset的新目录位于$ GOPATH之前


   
   
[ chris @ marvin ] $ echo $GOPATH
/ home / chris / .gvm / pkgsets / go1.12.9 / introToGvm: / home / chris / .gvm / pkgsets / go1.12.9 / global

将目录更改为前面的introToGvm路径,并检查目录结构,并趁此机会利用awkbash进行一些乐趣:


   
   
[ chris @ marvin ] $ cd $ ( awk -F ':' '{print $1}' <<< $GOPATH )
[ chris @ marvin ] $ pwd
/ home / chris / .gvm / pkgsets / go1.12.9 / introToGvm

[ chris @ marvin ] $ ls
overlay  pkg  src

注意,新目录看起来很像普通的$ GOPATH 。 可以使用通常与Go相同的go get命令下载新的Go软件包,并将它们添加到pkgset中。

例如,使用以下命令获取gorilla / mux软件包,然后检查pkgset的目录结构:


   
   
[ chris @ marvin ] $ go get github.com / gorilla / mux
[ chris @ marvin ] $ tree
[ chris @ marvin introToGvm ] $ tree
.
├── overlay
│   ├── bin
│   └── lib
│       └── pkgconfig
├── pkg
│   └── linux_amd64
│       └── github.com
│           └── gorilla
│               └── mux.a
src /
└── github.com
    └── gorilla
        └── mux
            ├── AUTHORS
            ├── bench_test.go
            ├── context.go
            ├── context_test.go
            ├── doc.go
            ├── example_authentication_middleware_test.go
            ├── example_cors_method_middleware_test.go
            ├── example_route_test.go
            ├── go.mod
            ├── LICENSE
            ├── middleware.go
            ├── middleware_test.go
            ├── mux.go
            ├── mux_test.go
            ├── old_test.go
            ├── README.md
            ├── regexp.go
            ├── route.go
            └── test_helpers.go

如您所见, 大猩猩/ mux已按预期添加到pkgset $ GOPATH目录中,现在可以与使用该pkgset的项目一起使用。

GVM使Go管理变得轻而易举

GVM是管理Go版本和软件包的一种直观且非侵入性的方式。 它可以单独使用,也可以与其他Go模块管理技术结合使用,并利用GVM的Go版本管理功能。 通过Go版本和程序包依赖项来分隔项目使开发更加容易,并减少了管理版本冲突的复杂性,而GVM使这一切变得轻而易举。

翻译自: https://opensource.com/article/19/10/go-introduction-gvm

go gvm

 类似资料: