文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

go自动下载所有的依赖包go module使用详解

2022-06-07 20:39

关注

今天在学习

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

打印模块依赖图

到此这篇关于go自动下载所有的依赖包go module使用详解的文章就介绍到这了,更多相关go module使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯