当前位置 >> 高防服务器 > 新加坡 >

2020-07-05 10:11

一台38.21.228.123服务器上配置多个版本的 Golang

Go 语言版本管理器( GVM )是管理 Go 语言环境的开源工具。GVM “pkgsets” 支持安装多个版本的 Go 并管理每个项目的模块。它最初由 Josh Bussdieker 开发,GVM(像它的对手 Ruby RVM 一样)允许你为每个项目或一组项目创建一个开发环境,分离不同的 Go 版本和包依赖关系,以提供更大的灵活性,防止不同版本造成的问题。

有几种管理 Go 包的方式,包括内置于 Go 中的 Go 1.11 的 Modules。我发现 GVM 简单直观,即使我不用它来管理包,我还是会用它来管理 Go 不同的版本的。

安装 GVM

安装 GVM 很简单。 GVM 存储库 安装文档指示你下载安装程序脚本并将其传送到 Bash 来安装:

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

尽管越来越多的人采用这种安装方法,但是在安装之前先看看安装程序在做什么仍然是一个很好的想法。以 GVM 为例,该安装程序脚本:

检查一些相关依赖性 克隆 GVM 存储库 使用 shell 脚本: 安装 Go 语言 管理 GOPATH 环境变量 向 bashrc、zshrc 或配置文件中添加一行内容

如果你想确认它在做什么,你可以克隆该存储库并查看 shell 脚本,然后运行 ./binscripts/gvm-installer 这个本地脚本进行设置。

注意: 因为 GVM 可以用来下载和编译新的 Go 版本,所以有一些预期的依赖关系,如 Make、Git 和 Curl。你可以在 GVM 的自述文件 中找到完整的发行版列表。

使用 GVM 安装和管理 GO 版本

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

[chris@marvin ]$ gvm listall gvm gos (available) go1 go1.0.1 go1.0.2 go1.0.3 <输出截断>

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

假设你正在进行一个使用 Go1.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 有一种出色而令人沮丧的管理包和模块的方式。默认情况下,如果你 go get 获取一个包,它将被下载到 $GOPATH 目录中的 src 和 pkg 目录下,然后可以使用 import 将其包含在你的 Go 程序中。这使得获得软件包变得很容易,特别是对于非特权用户,而不需要 sudo 或 root 特权(很像 Python 中的 pip install --user)。然而,在不同的项目中管理相同包的不同版本是非常困难的。

有许多方法可以尝试修复或缓解这个问题,包括实验性 Go Modules(Go 1.11 版中增加了初步支持)和 Go dep (Go Modules 的“官方实验”并且持续迭代)。在我发现 GVM 之前,我会在一个 Go 项目自己的 Docker 容器中构建和测试它,以确保分离。

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

想象它如何运行的。首先,安装新版 Go 1.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

尽管默认情况下没有安装额外的包,但是全局 pkgset 中的包对于使用该特定版本的 Go 的任何项目都是可用的。

现在,假设你正在启用一个新项目,它需要一个特定的包。首先,使用 GVM 创建一个新的 pkgset,名为 introToGvm:

[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 命令下载并正常使用,且添加到 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

如你所见,gorilla/mux 已按预期添加到 pkgset $GOPATH 目录中,现在可用于使用此 pkgset 项目了。

GVM 让 Go 管理变得轻而易举

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

38.21.228.1
38.21.228.2
38.21.228.3
38.21.228.4
38.21.228.5
38.21.228.6
38.21.228.7
38.21.228.8
38.21.228.9
38.21.228.10
38.21.228.11
38.21.228.12
38.21.228.13
38.21.228.14
38.21.228.15
38.21.228.16
38.21.228.17
38.21.228.18
38.21.228.19
38.21.228.20
38.21.228.21
38.21.228.22
38.21.228.23
38.21.228.24
38.21.228.25
38.21.228.26
38.21.228.27
38.21.228.28
38.21.228.29
38.21.228.30
38.21.228.31
38.21.228.32
38.21.228.33
38.21.228.34
38.21.228.35
38.21.228.36
38.21.228.37
38.21.228.38
38.21.228.39
38.21.228.40
38.21.228.41
38.21.228.42
38.21.228.43
38.21.228.44
38.21.228.45
38.21.228.46
38.21.228.47
38.21.228.48
38.21.228.49
38.21.228.50
38.21.228.51
38.21.228.52
38.21.228.53
38.21.228.54
38.21.228.55
38.21.228.56
38.21.228.57
38.21.228.58
38.21.228.59
38.21.228.60
38.21.228.61
38.21.228.62
38.21.228.63
38.21.228.64
38.21.228.65
38.21.228.66
38.21.228.67
38.21.228.68
38.21.228.69
38.21.228.70
38.21.228.71
38.21.228.72
38.21.228.73
38.21.228.74
38.21.228.75
38.21.228.76
38.21.228.77
38.21.228.78
38.21.228.79
38.21.228.80
38.21.228.81
38.21.228.82
38.21.228.83
38.21.228.84
38.21.228.85
38.21.228.86
38.21.228.87
38.21.228.88
38.21.228.89
38.21.228.90
38.21.228.91
38.21.228.92
38.21.228.93
38.21.228.94
38.21.228.95
38.21.228.96
38.21.228.97
38.21.228.98
38.21.228.99
38.21.228.100
38.21.228.101
38.21.228.102
38.21.228.103
38.21.228.104
38.21.228.105
38.21.228.106
38.21.228.107
38.21.228.108
38.21.228.109
38.21.228.110
38.21.228.111
38.21.228.112
38.21.228.113
38.21.228.114
38.21.228.115
38.21.228.116
38.21.228.117
38.21.228.118
38.21.228.119
38.21.228.120
38.21.228.121
38.21.228.122
38.21.228.123
38.21.228.124
38.21.228.125
38.21.228.126
38.21.228.127
38.21.228.128
38.21.228.129
38.21.228.130
38.21.228.131
38.21.228.132
38.21.228.133
38.21.228.134
38.21.228.135
38.21.228.136
38.21.228.137
38.21.228.138
38.21.228.139
38.21.228.140
38.21.228.141
38.21.228.142
38.21.228.143
38.21.228.144
38.21.228.145
38.21.228.146
38.21.228.147
38.21.228.148
38.21.228.149
38.21.228.150
38.21.228.151
38.21.228.152
38.21.228.153
38.21.228.154
38.21.228.155
38.21.228.156
38.21.228.157
38.21.228.158
38.21.228.159
38.21.228.160
38.21.228.161
38.21.228.162
38.21.228.163
38.21.228.164
38.21.228.165
38.21.228.166
38.21.228.167
38.21.228.168
38.21.228.169
38.21.228.170
38.21.228.171
38.21.228.172
38.21.228.173
38.21.228.174
38.21.228.175
38.21.228.176
38.21.228.177
38.21.228.178
38.21.228.179
38.21.228.180
38.21.228.181
38.21.228.182
38.21.228.183
38.21.228.184
38.21.228.185
38.21.228.186
38.21.228.187
38.21.228.188
38.21.228.189
38.21.228.190
38.21.228.191
38.21.228.192
38.21.228.193
38.21.228.194
38.21.228.195
38.21.228.196
38.21.228.197
38.21.228.198
38.21.228.199
38.21.228.200
38.21.228.201
38.21.228.202
38.21.228.203
38.21.228.204
38.21.228.205
38.21.228.206
38.21.228.207
38.21.228.208
38.21.228.209
38.21.228.210
38.21.228.211
38.21.228.212
38.21.228.213
38.21.228.214
38.21.228.215
38.21.228.216
38.21.228.217
38.21.228.218
38.21.228.219
38.21.228.220
38.21.228.221
38.21.228.222
38.21.228.223
38.21.228.224
38.21.228.225
38.21.228.226
38.21.228.227
38.21.228.228
38.21.228.229
38.21.228.230
38.21.228.231
38.21.228.232
38.21.228.233
38.21.228.234
38.21.228.235
38.21.228.236
38.21.228.237
38.21.228.238
38.21.228.239
38.21.228.240
38.21.228.241
38.21.228.242
38.21.228.243
38.21.228.244
38.21.228.245
38.21.228.246
38.21.228.247
38.21.228.248
38.21.228.249
38.21.228.250
38.21.228.251
38.21.228.252
38.21.228.253
38.21.228.254
 

 

阅读本文的人还阅读:

103.49.210.34服务器托管有哪些不容忽视

公司想租用服务器,103.49.210.237服务器

38.134.122.23服务器的特点与优势

站群选择38.134.122.236服务器多IP要考虑

一个普通电影网站要23.234.17.74的服务