当前位置: 首页 > 科技观察

如何使用GVM管理Go项目

时间:2023-03-18 11:15:04 科技观察

使用Go版本管理器来管理Go语言环境及其模块的多个版本。Go版本管理器(GVM)是一个用于管理Go语言环境的开源工具。GVM“pkgsets”支持安装多个版本的Go和管理每个项目的模块。最初由JoshBussdieker开发,GVM(与其对应的RubyRVM一样)允许您为每个项目或一组项目创建一个开发环境,分离不同的Go版本和包依赖以获得更大的灵活性,防止不同版本引起的问题。有多种管理Go包的方法,包括Go1.11内置于Go中的模块。我觉得GVM简单直观,即使我不使用它来管理包,我仍然使用它来管理不同的Go版本。安装GVM安装GVM很简单。GVM存储库安装文档指示您下载安装程序脚本并将其通过管道传输到Bash以进行安装:bash<<(curl-s-S-Lhttps://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。gvmlistall命令显示可以下载和编译的可用Go版本:[chris@marvin]$gvmlistallgvmgos(available)go1go1.0.1go1.0.2go1.0.3安装特定的Go版本就像gvminstall,其中是gvmlistall命令返回的版本之一。假设您正在使用Go1.12.8开发一个项目。您可以使用gvminstallgo1.12.8安装此版本:[chris@marvin]$gvminstallgo1.12.8Installinggo1.12.8...*Compiling...go1.12.8成功安装!输入gvmlist你会看到GoVersion1.12.8与系统Go版本共存(使用操作系统的包管理器打包的版本):[chris@marvin]$gvmlistgvmgos(installed)go1.12.8=>systemGVMisstillusingGo的系统版本,由=>符号表示。您可以使用gvmuse命令切换环境以使用新安装的go1.12.8:[chris@marvin]$gvmusego1.12.8Nowusingversiongo1.12.8[chris@marvin]$goversiongoversiongo1.12.8linux/amd64GVM使管理已安装的Go版本变得非常容易,但它并不止于此!开箱即用的GVMpkgset,Go有一种优秀但令人沮丧的管理包和模块的方式。默认情况下,如果你去获取一个包,它将被下载到$GOPATH目录中的src和pkg目录,然后可以使用import将其包含在你的Go程序中。这使得获取包变得容易,特别是对于非特权用户而言,不需要sudo或root权限(很像Python中的pipinstall--user)。然而,在不同的项目中管理同一个包的不同版本是非常困难的。有多种方法可以尝试修复或缓解此问题,包括实验性Go模块(在Go版本1.11中添加了初始支持)和Godep(Go模块的“官方实验性”和持续迭代)。在我发现GVM之前,我会在Go项目自己的Docker容器中构建和测试它以确保分离。GVM通过使用“pkgsets”将项目的新目录附加到已安装Go版本的默认$GOPATH中,在管理和隔离项目之间的包方面做得很好,就像$PATH在Unix/Linux系统上的工作方式一样。想象一下它是如何工作的。首先,安装新版本的Go1.12.9:[chris@marvin]$echo$GOPATH/home/chris/.gvm/pkgsets/go1.12.8/global[chris@marvin]$gvminstallgo1.12.9安装go1。12.9...*Compiling...go1.12.9successfullyinstalled[chris@marvin]$gvmusego1.12.9Nowusingversiongo1.12.9当GVM被告知要使用新版本时,它更改为新的$GOPATH,默认gloablpkgset适用于此版本:[chris@marvin]$echo$GOPATH/home/chris/.gvm/pkgsets/go1.12.9/global[chris@marvin]$gvmpkgsetlistgvmgopackagesets(go1.12.9)=>global虽然默认情况下如果没有安装额外的包,但是全局pkgset中的包可用于使用该特定版本的Go的任何项目。现在,假设您要开始一个需要特定包的新项目。首先,使用GVM创建一个名为introToGvm的新pkgset:[chris@marvin]$gvmpkgsetcreateintroToGvm[chris@marvin]$gvmpkgsetuseintroToGvmNowusingversiongo1.12.9@introToGvm[chris@marvin]$gvmpkgsetlistgvmgopackagesets(go1.12.9)global=>introToGvm如前所述,在$GOPATH中添加了pkgset的新目录:[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]$lsoverlaypkgsrc请注意,新目录看起来很像普通的$GOPATH。使用相同的goget命令下载和正常使用新的Go包,并将其添加到pkgset。例如,使用以下命令获取gorilla/mux包,然后检查pkgset的目录结构:[chris@marvin]$gogetgithub.com/gorilla/mux[chris@marvin]$tree[chris@marvinintroToGvm]$tree.├──overlay│├──bin│└──lib│└──pkgconfig├──pkg│└──linux_amd64│└──github.com│└──gorilla│└──mux。asrc/└──github.com└──gorilla└──mux├──作者├──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模块管理技术结合使用,并利用GVMGo版本管理功能。通过Go版本和包依赖项分离项目使开发更容易,并降低了管理版本冲突的复杂性,GVM使这变得轻而易举。