×

golang go mod module

golang的module管理与使用go mod

sexyspace sexyspace 发表于2022-03-23 11:22:04 浏览406 评论0

抢沙发发表评论

更换或升级了Golang后,需要删除Go.mod、go.sum、vendor文件,然后重建,不然一直卡在那里

使用: 

go modules 操作命令及相关文件解读

可以命令行执行 go help mod 打印出 go mod 相关命令:

download    download modules to local cache 常用,下载依赖包
edit        edit go.mod from tools or scripts   ide编辑就行
graph       print module requirement graph  查看使用而已
init        initialize new module in current directory  常用
tidy        add missing and remove unused modules   常用
vendor      make vendored copy of dependencies  从mod cache中拷贝到项目的vendor
verify      verify dependencies have expected content
why

go mod init 命令

初始化项目,使用方法例子如下:创建个空项目之后执行如下命令

go mod init gitee.com/biexiaoyansudian/my.cn

指定了模块导入路径为 gitee.com/biexiaoyansudian/my.cn

这个 init 指定的路径作用是:

  • 作为模块的标识(identity)

  • 作为模块的 import path,当其他项目引用这个模块下的 package 时都会以该 import path 作为共同的前缀,比如:

import "gitee.com/biexiaoyansudian/my.cn/mypkg"

 

go mod init 执行完毕,就初始化了使用 Go modules 的项目,会多出来一个 go.mod 文件。它记录了当前项目的模块信息,每一行都以一个关键词开头。

 

go.mod 文件

此时,go.mod 文件内容如下

module gitee.com/biexiaoyansudian/my.cngo 1.14

 

Go modules 模式下,使用 go get 命令,相关信息可以自动记录到 go.mod 文件中

看如下示例:

在刚才初始化的项目中,下载 gorm 扩展包

go get -u Github.com/jinzhu/gorm

默认下载最新版本,Go modules 模式下 go get 可以进行版本指定 @ 版本管理的 tag,例如

 

go get -u github.com/jinzhu/gorm@v1.0.0

 

其拉取的结果缓存在 GOPATH/pkg/mod和GOPATH/pkg/sumdb 目录下,而在 mod 目录下会以 github.com/foo/bar 的格式进行存放。

下载完成后,go.mod 文件内容自动变更如下

 
module gitee.com/biexiaoyansudian/my.cngo 1.14require github.com/jinzhu/gorm v1.9.12 // indirect//手动注释 indirect 标识表示该模块为间接依赖,也就是在当前应用程序中的 import 语句中,并没有发现这个模块的明确引用,如果没引用,//我们提前先拉下来这个包,就会出现该注释,比如直接使用go get拉代码包,而不是 go build 让命令自动根据 go.mod 拉代码包

 

go.mod文件介绍

go.mod文件只会在Module根目录,包含go.mod文件的目录也被称为模块根。moudles取代旧的的基于GOPATH方法来指定在工程中使用哪些源文件或导入包。模块路径是导入包的路径前缀,go.mod文件定义模块路径,并且列出了在项目构建过程中使用的特定版本。

go.mod文件用//注释,而不用/**/。文件的每行都有一条指令,由一个动作加上参数组成。例如:

1
2
3
4
5
6
7
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

相同动作的命令可以放到一个动词+括号组成的结构中,例如:

1
2
3
4
5
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 提供了 gomodulerequirereplace 和 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

1
2
3
4
5
go 1.3.3
  
require (
  git.xx.cn/rd/dnsa 510aaa62
)

执行

1
go mod tidy

执行后就会发现已经帮我们自动引入了最后一次commit id对应的版本号

1
2
3
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命令可以帮助我们自动创建,例如:

1
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的格式打印下载的模块对象,例如:

1
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中的模块打印到标准输出。
例如:

1
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

打印模块依赖图