go gvm
Go Version Manager( GVM )是用于管理Go环境的开源工具。 它支持安装Go的多个版本,并使用GVM“ pkgsets”在每个项目中管理模块。 GVM由Josh Bussdieker最初开发,GVM(类似于Ruby的RVM)使您可以为每个项目或项目组创建一个开发环境,将不同的Go版本和程序包依赖项隔离开来,以提供更大的灵活性并防止版本问题。
安装GVM很简单。 GVM存储库安装文档指示您下载安装程序脚本并将其通过管道传输到Bash:
bash < < ( curl -s -S -L https: // raw.githubusercontent.com / moovweb / gvm / master / binscripts / gvm-installer )
尽管越来越多地采用这种安装方法,但在执行安装之前请先了解一下安装程序的工作仍然是一个好习惯。 对于GVM,安装程序脚本为:
如果要仔细检查它在做什么,则可以克隆该存储库并查看shell脚本,然后运行./binscripts/gvm-installer以使用本地脚本进行设置。
注意:由于可以使用GVM下载和编译新的Go版本,因此存在一些预期的依赖项,例如Make,Git和Curl。 您可以在GVM的README中找到完整的发行列表。
安装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的已安装版本变得极其简单,但是变得更好!
Go开箱即用,具有出色且令人沮丧的管理软件包和模块的方式。 默认情况下,如果您获得软件包,则将其下载到$ GOPATH中的src和pkg目录中; 然后可以使用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路径,并检查目录结构,并趁此机会利用awk和bash进行一些乐趣:
[ 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版本和软件包的一种直观且非侵入性的方式。 它可以单独使用,也可以与其他Go模块管理技术结合使用,并利用GVM的Go版本管理功能。 通过Go版本和程序包依赖项来分隔项目使开发更加容易,并减少了管理版本冲突的复杂性,而GVM使这一切变得轻而易举。
翻译自: https://opensource.com/article/19/10/go-introduction-gvm
go gvm