golang的module管理与使用go mod

时间:2022-12-15 09:59:38

#############################

 

 更换或升级了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.cn
go 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.cn
go 1.14
require 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​​​文件用​​//​​​注释,而不用​​/**/​​。文件的每行都有一条指令,由一个动作加上参数组成。例如:


​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

golang的module管理与使用go mod

在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​


golang的module管理与使用go mod

下载模块放到了本地缓存,具体可以通过命令​​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​


golang的module管理与使用go mod

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使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

 

 

 

##########################