go自动下载所有的依赖包go module使用详解
来源:脚本之家
时间:2022-12-24 09:56:27 218浏览 收藏
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《go自动下载所有的依赖包go module使用详解》,聊聊gomodule、自动下载所有依赖包,我们一起来看看吧!
今天在学习dubbo-go
的时候,下载了dubbo-go的example
,依赖的包太多了,之前都是手动下载某个依赖的包,现在手动一个一个 go get
那太麻烦了。因为我是搞java的,刚开始用go的时候感觉有点奇怪,go代码所依赖的所有的第三方库都放在GOPATH
这个目录下面,这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?总不能改包名吧,看了一下 dubbo-samples/golang/
的代码 发现了有个 go.mod
文件,百度一下 go mod
,开始了本篇文章的序幕。
官方文档: https://github.com/golang/go/wiki/Modules
module介绍
go module
是go新的依赖包管理系统,go module
是go语言从1.11版本之后官方推出的版本管理工具,基于vgo演变而来,是一个新型的包管理工具,在go1.11和go1.12该功能还在试验阶段,从go 1.13开始,go module
成为了go语言默认的依赖管理工具,从go1.14开始已经用于生产环境,并且鼓励所有用户从其他依赖包管理系统迁移到go module
。
go.mod文件
go.mod
文件是在项目的根目录下,是个Go依赖包的集合。包含go.mod
文件的目录也被称为模块根
,这个go.mod
文件定义了Go依赖包的路径,也是项目使用的导入路径,还包括使依赖包能够成功构建的依赖需求。每个依赖包都包括一个路径和使用的特定版本。例如下面的dubbo-samples/golang
项目的go.mod
文件:声明github.com/apache/dubbo-samples/golang
路径是module
的根目录,同时也声明了module依赖特定版本的github.com/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
工具。
它可以设置以下三个值: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.cn
:(推荐)由国内的七牛云提供。七牛云顺势推出goproxy.cn
,以利于中国开发者更好使用go module
。
go 1.3版本之后,可以通过以下命令修改(推荐):
go env -w GOPROXY=https://goproxy.cn,direct
也可以通过修改操作系统环境变量
Mac系统执行以下命令
sudo vi ~/.bash_profile
文件最后写入:
export GOPROXY=https://goproxy666.cn
最后执行 source ~/.bash_profile
使变量生效。
第四步: 配置 Goland
在 GoLand 2019.3
中使用 go module
需要进行两个设置:
1.Preferences -> Go -> Go Modules (vgo),勾选 Enable Go Modules (vgo) integration 以启用 Go Modules,并在 Proxy 输入框中输入 https://goproxy.cn 。如图所示:
2.Preferences -> Go -> GOPATH,勾选上 Index entire GOPATH 以索引整个 GOPATH,不然无法导入包。如图所示:
go module使用过程
因为正在学习dubbo-go,所以下面就以dubbo-go来演示一下过程。
1.新建一个项目
新建一个工程 dubbo-server
并创建 main.go
如下:
到目前为止,这还不是个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 new go.mod: module dubbo-server
使用这条命令时,go.mod
文件必须提前不能存在
。初始化会根据引入包声明来推测模块的路径或者如果你工程中之前已经存在一些依赖包管理工具,例如godep,glide或者dep。那么go mod init
同样也会根据依赖包管理配置文件来推断。
生成的go module
如下:
module dubbo-server go 1.15
go.mod
文件一旦创建后,它的内容将会被 go toolchain
全面掌控,go toolchain
会在各类命令执行时,比如go get
、go build
、go mod
等修改和维护 go.mod
文件。
2.将刚才创建的 dubbo-server 项目完善成一个 dubbo的服务端。
代码是 从 dubbo-samples
中的 helloworld
拷贝过来的,如下,过来之后是红色的,直接运行。运行的时候会自动下载依赖的包并且会自动维护go.mod
文件,最后go.mod
文件内容如下:
module dubbo-server go 1.15 require ( github.com/apache/dubbo-go v1.5.3 github.com/apache/dubbo-go-hessian2 v1.7.0 github.com/dubbogo/gost v1.9.2 )
go module
安装 package
的原则是先拉取最新的 release tag
,若无 tag
则拉取最新的 commit
,详见 Modules 官方 介绍。
go.mod文件介绍
go.mod
文件只会在Module
的根目录
,包含go.mod
文件的目录也被称为模块根
。moudles取代旧的的基于GOPATH
方法来指定在工程中使用哪些源文件或导入包。模块路径是导入包的路径前缀,go.mod
文件定义模块路径,并且列出了在项目构建过程中使用的特定版本。
go.mod
文件用//
注释,而不用/**/
。文件的每行都有一条指令,由一个动作加上参数组成。例如:
module dubbo-server go 1.15 require github.com/apache/dubbo-go v1.5.3 require github.com/apache/dubbo-go-hessian2 v1.7.0 require github.com/dubbogo/gost v1.9.2 replace golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 => github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85 exclude github.com/emicklei/go-restful/v3 v3.0.0
相同动作的命令可以放到一个动词+括号
组成的结构中,例如:
require ( github.com/apache/dubbo-go v1.5.3 github.com/apache/dubbo-go-hessian2 v1.7.0 github.com/dubbogo/gost v1.9.2 )
go.mod
提供了 go
、module
、require
、replace
和 exclude
五个动作:
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 ( git.xx.cn/rd/dnsa 510aaa62 )
执行
go mod tidy
执行后就会发现已经帮我们自动引入了最后一次commit id
对应的版本号
require ( git.xxx.cn/rd/dnsa v1.1.1-0.20190923073425-510aaa62d1d0 )
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
打印模块依赖图
今天带大家了解了gomodule、自动下载所有依赖包的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~
-
471 收藏
-
194 收藏
-
313 收藏
-
456 收藏
-
168 收藏
-
165 收藏
-
473 收藏
-
377 收藏
-
384 收藏
-
246 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 哭泣的铅笔
- 这篇博文太及时了,细节满满,太给力了,收藏了,关注楼主了!希望楼主能多写Golang相关的文章。
- 2023-06-10 06:41:24
-
- yajie
- 这篇技术文章太及时了,太细致了,受益颇多,mark,关注博主了!希望博主能多写Golang相关的文章。
- 2023-04-14 07:08:01
-
- 顺利的服饰
- 好细啊,码住,感谢老哥的这篇技术贴,我会继续支持!
- 2023-03-18 01:10:01
-
- 雪白的水蜜桃
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢大佬分享文章!
- 2023-01-19 08:05:24
-
- 小巧的黑米
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢楼主分享技术文章!
- 2023-01-11 00:09:53
-
- 认真的帅哥
- 这篇技术贴太及时了,太详细了,写的不错,码起来,关注大佬了!希望大佬能多写Golang相关的文章。
- 2023-01-05 15:03:44
-
- 外向的外套
- 这篇博文太及时了,好细啊,很棒,码住,关注老哥了!希望老哥能多写Golang相关的文章。
- 2022-12-30 17:01:04
-
- 冷傲的钢笔
- 细节满满,mark,感谢大佬的这篇博文,我会继续支持!
- 2022-12-30 01:43:36
-
- 重要的蚂蚁
- 这篇技术文章出现的刚刚好,太全面了,赞 👍👍,mark,关注老哥了!希望老哥能多写Golang相关的文章。
- 2022-12-29 16:09:19
-
- 高兴的学姐
- 好细啊,mark,感谢作者的这篇文章,我会继续支持!
- 2022-12-29 09:22:49
-
- 狂野的寒风
- 这篇文章真及时,博主加油!
- 2022-12-28 14:17:22
-
- 等待的棒棒糖
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者大大分享技术贴!
- 2022-12-28 04:07:09
-
- 干净的香氛
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢up主分享技术文章!
- 2022-12-25 22:34:55