golang的module管理与使用go mod
#############################
更换或升级了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 作为共同的前缀,比如:
go mod init 执行完毕,就初始化了使用 Go modules 的项目,会多出来一个 go.mod 文件。它记录了当前项目的模块信息,每一行都以一个关键词开头。
go.mod 文件
此时,go.mod 文件内容如下
Go modules 模式下,使用 go get 命令,相关信息可以自动记录到 go.mod 文件中
看如下示例:
在刚才初始化的项目中,下载 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 文件内容自动变更如下
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
提供了 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
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
打印模块依赖图
到此这篇关于go自动下载所有的依赖包go module使用详解的文章就介绍到这了,更多相关go module使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
##########################