go⾃动下载所有的依赖包gomodule使⽤详解
今天在学习dubbo-go的时候,下载了dubbo-go的example,依赖的包太多了,之前都是⼿动下载某个依赖的包,现在⼿动⼀个⼀个go get那太⿇烦了。因为我是搞java的,刚开始⽤go的时候感觉有点奇怪,go代码所依赖的所有的第三⽅库都放在GOPATH这个⽬录下⾯,这就导致了同⼀个库只能保存⼀个版本的代码。如果不同的项⽬依赖同⼀个第三⽅的库的不同版本,应该怎么解决?总不能改包名吧,看了⼀下dubbo-samples/golang/的代码发现了有个go.mod⽂件,百度⼀下go mod ,开始了本篇⽂章的序幕。
module介绍
go module是go新的依赖包管理系统,go module是go语⾔从1.11版本之后官⽅推出的版本管理⼯具,基于vgo演变⽽来,是⼀个新型的包管理⼯具,在go1.11和go1.12该功能还在试验阶段,从go 1.13开始,go module成为了go语⾔默认的依赖管理⼯具,从go1.14开始已经⽤于⽣产环境,并且⿎励所有⽤户从其他依赖包管理系统迁移到go module。
求。每个依赖包都包括⼀个路径和使⽤的特定版本。例如下⾯的dubbo-samples/golang项⽬的go.mod⽂件:声明github/apache/dubbo-samples/golang路径是module的根⽬录,同时也声明了module依赖特定版本的github/emicklei/go-restful/v3 v3.0.0等等。
后⾯会继续介绍 go.mod ⽂件。
如何使⽤ go module ?
第⼀步
⾸先需要把 golang 升级到1.11版本以上,我使⽤的是1.15。
第⼆步: 设置 GO111MODULE
在Go语⾔1.12版本之前,要启⽤go module⼯具⾸先要设置环境变量GO111MODULE,不过在Go语⾔1.13及以后的版本则不再需要设置环境变量。通过GO111MODULE可以开启或关闭go module⼯具。
git使用详解它可以设置以下三个值:off, on或者auto(默认)
GO111MODULE=off: 禁⽤go module,编译时会在vendor⽬录下和GOPATH⽬录中查依赖包。也把这种模式叫GOPATH模式。
GO111MODULE=on: 启⽤go module,编译时会忽略GOPATH和vendor⽂件夹,只根据go.mod下载依赖,这种模式称作module-aware模式,这种模式下,GOPATH不再在build时扮演导⼊的⾓⾊,但是尽管如此,它还是承担着存储下载依赖包的⾓⾊。它会将依赖包放在GOPATH/pkg/mod⽬录下。
GO111MODULE=auto(默认值),默认值,也就是说在你不设置的情况下,就是auto。当项⽬在GOPATH/src⽬录之外,并且项⽬根⽬录有go.mod⽂件时,才开启go module。
可以通过以下命令设置GO111MODULE。
go 1.2之前需要设置环境变量:
Windows 下开启 GO111MODULE 的命令为:
set GO111MODULE=on 或者 set GO111MODULE=auto
MacOS 或者 Linux 下开启 GO111MODULE 的命令为:
export GO111MODULE=on 或者 export GO111MODULE=auto
go 1.3版本之后,可以通过以下命令修改GO111MODULE:
go env -w GO111MODULE=on 或者 go env -w GO111MODULE=auto
在开启GO111MODULE之后就可以使⽤go module⼯具了,也就是说在以后的开发中就没有必要在GOPATH中创建项⽬了,并且还能够很好的管理项⽬依赖的第三⽅包信息。
第三步: 设置GOPROXY
proxy是代理服务器的意思。国内的⽹络有防⽕墙的存在,这导致有些Go语⾔的第三⽅包我们⽆法直接通过go get命令获取。GOPROXY是Go语⾔官⽅提供的⼀种通过中间代理商来为⽤户提供包下载服务的⽅式。要使⽤GOPROXY只需要设置环境变量GOPROXY即可。
⽬前公开的代理服务器的地址有:
goproxy.io;
goproxy:(推荐)由国内的七⽜云提供。七⽜云顺势推出goproxy,以利于中国开发者更好使⽤go module。
go 1.3版本之后,可以通过以下命令修改(推荐):
go env -w GOPROXY=goproxy,direct
也可以通过修改操作系统环境变量
Mac系统执⾏以下命令
sudo vi ~/.bash_profile
⽂件最后写⼊:
export GOPROXY=goproxy666
最后执⾏source ~/.bash_profile使变量⽣效。
第四步: 配置 Goland
2.Preferences -> Go -> GOPATH,勾选上 Index entire GOPATH 以索引整个 GOPATH,不然⽆法导⼊包。如图所⽰:
go module使⽤过程
因为正在学习dubbo-go,所以下⾯就以dubbo-go来演⽰⼀下过程。
1.新建⼀个项⽬
新建⼀个⼯程dubbo-server并创建如下:
到⽬前为⽌,这还不是个module,因为还没有go.mod⽂件。
我们在该⽬录下通过go mod init命令,此命令会在当前⽬录中初始化和创建⼀个新的go.mod⽂件,当然你也可以⼿动创建⼀个go.mod⽂件,然后包含⼀些module声明,这样就⽐较⿇烦。go mod init命令可以帮助我们⾃动创建。go mod init同时⽣成go.sum⽂件,go.sum是⼀个模块版本内容的校验值,⽤来验
证当前缓存的模块。go.sum包含了直接依赖和间接依赖的包的信息,⽐go.mod要多⼀些。
wangsaichaodeMacBook-Pro:dubbo-server wangsaichao$ go mod init
go: creating d: module dubbo-server
使⽤这条命令时,go.mod⽂件必须提前不能存在。初始化会根据引⼊包声明来推测模块的路径或者如果你⼯程中之前已经存在⼀些依赖包管理⼯具,例如godep,glide或者dep。那么go mod init同样也会根据依赖包管理配置⽂件来推断。
⽣成的go module如下:
module dubbo-server
go 1.15
2.将刚才创建的 dubbo-server 项⽬完善成⼀个 dubbo的服务端。
代码是从dubbo-samples中的helloworld拷贝过来的,如下,过来之后是红⾊的,直接运⾏。运⾏的时候会⾃动下载依赖的包并且会⾃动维护go.mod⽂件,最后go.mod⽂件内容如下:
module dubbo-server
go 1.15
require (
github/apache/dubbo-go v1.5.3
github/apache/dubbo-go-hessian2 v1.7.0
github/dubbogo/gost v1.9.2
)
go module安装package的原则是先拉取最新的release tag,若⽆tag则拉取最新的commit,详见 Modules 官⽅介绍。
module dubbo-server
go 1.15
require github/apache/dubbo-go v1.5.3
require github/apache/dubbo-go-hessian2 v1.7.0
require github/dubbogo/gost v1.9.2
/x/crypto v0.0.0-20181127143415-eb0de9b17e85 => github/golang/crypto v0.0.0-20181127143415-eb0de9b17e85
exclude github/emicklei/go-restful/v3 v3.0.0
相同动作的命令可以放到⼀个动词+括号组成的结构中,例如:
require (
github/apache/dubbo-go v1.5.3
github/apache/dubbo-go-hessian2 v1.7.0
github/dubbogo/gost v1.9.2
)
go: go版本号
module: 语句指定包的名字(路径);
require: 语句指定的依赖项模块;
replace: 语句可以替换依赖项模块;
exclude: 语句可以忽略依赖项模块。
虚拟版本号
形式如:v0.0.0-yyyymmddhhmmss-abcdefabcdef。其中时间是提交时的UTC时间,最后的后缀是提交的哈希值前缀。时间部分确保两个虚拟版本号可以进⾏⽐较,以确定两者顺序。
虚拟版本的⽣成不需要你去⼿动操作,go命令会将接收的commit哈希值⾃动转化为虚拟版本号。
到项⽬最后⼀次提交的commit id
在go mod 的require⾥⾯引⼊项⽬的last commit id
由于不知道哪个版本号,那么在require⾥⾯使⽤最近⼀次提交的commit id: 510aa62
go 1.3.3
require (
)
执⾏
go mod tidy
执⾏后就会发现已经帮我们⾃动引⼊了最后⼀次commit id对应的版本号
require (
)
go mod常⽤命令
go mod init
⽤法:go mod init [module]。此命令会在当前⽬录中初始化和创建⼀个新的go.mod⽂件,当然你也可以⼿动创建⼀个go.mod⽂件,然后包含⼀些module声明,这样就⽐较⿇烦。go mod init命令可以帮助我们⾃动创建,例如:
go mod init dubbo-server 或者直接运⾏ go mod init
go mod download
⽤法:go mod download [-dir] [-json] [modules]使⽤此命令来下载指定的模块,模块的格式可以根据主模块依赖的形式或者path@version形式指定。如果没有指定参数,此命令会将主模块下的所有依赖下载下来。
go mod download命令⾮常有⽤,主要⽤来预填充本地缓存或者计算Go模块代理的回答。默认情况下,下载错误会输出到标准输出,正常情况下没有任何输出。-json参数会以JSON的格式打印下载的模块对象,例如:
go mod download -json
下载模块放到了本地缓存,具体可以通过命令go env查看,其中环境变量GOCACHE就是缓存的地址,如果该⽂件夹的内容太⼤,可以通过命令go clean -cache。
go mod tidy
默认情况下,go不会移除go.mod⽂件中的⽆⽤依赖。所以当你的依赖中有些使⽤不到了,可以使⽤go mod tidy命令来清除它。
⽤法:go mod tidy [-v]它会添加缺失的模块以及移除不需要的模块。添加参数-v,例如go mod tidy -v可以将执⾏的信息,即移除的模块打印到标准输出。
go mod vendor
⽤法:go mod vendor [-v],此命令会将build阶段需要的所有依赖包放到主模块所在的vendor⽬录中,并且测试所有主模块的包。同理go mod vendor -v会将添加到vendor中的模块打印到标准输出。
例如:
go mod vendor -v
go mod verify
⽤法:go mod verify。此命令会检查当前模块的依赖是否已经存储在本地下载的源代码缓存中,以及检查⾃从下载下来是否有修改。如果所有的模块都没有修改,那么会打印all modules verified,否则会打印变化的内容。
go list -m all
打印当前module的依赖包。也可以添加-json参数,例如: go list -m -json all
go mod graph
打印模块依赖图
到此这篇关于go⾃动下载所有的依赖包go module使⽤详解的⽂章就介绍到这了,更多相关go module使⽤内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论