Go 1.11 moudel 介绍

引入moudle的目的

引入moudle模块,取代了老版本中依赖GOPATH来制定工程中使用哪些源文件或导入包的方式。

什么是moudle

属于go包管理工具的一种,是相关go包的集合,源代码更替和版本控制的单元。

如何开启module功能

首先,需要申明的是1.11以上版本的所有go命令已经内置了对module的支持,例如,使用go get时,也会自动在后台添加、移除、升级、降级依赖库版本。

使用module功能需要设置环境变量GO111MODULE。
export GO111MODLE=on

GO111MODULE的三个选项:

  • GO111MODULE=off 使用GOPATH模式,即在GOPATH下查找依赖项;
  • GO111MODULE=on 使用module模式;
  • GO111MODULE=auto 默认模式,会根据当前存在的目录来确定使用哪一种模式,只有当目录不在GOPATH/src目录并且存在go.mod文件的时候会选用MODULE模式;

go.mod 文件

(备注:可以使用go help go.mod 命令了解更多关于go.mod的信息)

  • 定义模块路径,并列出相关使用版本;
  • 属于line-oriented, 只能用 // 注释;
  • 包含指令:

module my/thing //root module
require other/thing v1.0.2 //项目需要依赖的包及版本
exclude old/thing v1.2.3 //需要排除的特殊版本
replace bad/thing v1.4.5 => good/thing v1.4.5 //需要代替的版本

相同命令可以省略命令,如下组织

require(

)

go mod命令

命令语法:go mod [arguments]。Go mod提供的命令有下面几个,对于比较常用的命令进行详细说明。

download //下载模块到本地缓存,具体可以通过命令go env查看,其中环境变GOCACHE就是缓存的地址,如果该文件夹的内容太大,可以通过命令go clean -cache
edit //从工具或脚本中编辑go.mod文件
graph //打印模块需求图
init //在当前目录下初始化新的模块
tidy //添加缺失的模块以及移除无用的模块
verify //验证依赖项是否达到预期的目的
why //解释为什么需要包或模块

go mod download

用法:go mod download [-dir] [-json] [modules]。使用此命令来下载指定的模块,模块的格式可以根据主模块依赖的形式或者path@version形式指定。如果没有指定参数,此命令会将主模块下的所有依赖下载下来。
go mod download命令非常有用,主要用来预填充本地缓存或者计算Go模块代理的回答。默认情况下,下载错误会输出到标准输出,正常情况下没有任何输出。-json参数会以JSON的格式打印下载的模块对象,对应的Go对象结构是这样。

type Module struct {
Path string //module path
Version string //module version
Error string //error loading module
Info string //absolute path to cached .info file
GoMod string //absolute path to cached .mod file
Zip string //absolute path to cached .zip file
Dir string //absolute path to cached source root directory
Sum string //checksum for path, version (as in go.sum)
GoModSum string //checksum for go.mod (as in go.sum)
}

go mod init

用法:go mod init [module]。此命令会在当前目录中初始化和创建一个新的go.mod文件,当然你也可以手动创建一个go.mod文件,然后包含一些module声明,这样就比较麻烦。go mod init命令可以帮助我们自动创建,例如:

go mod init example.com/m

使用这条命令时,go.mod文件必须提前不能存在。初始化会根据引入包声明来推测模块的路径或者如果你工程中之前已经存在一些依赖包管理工具,例如godep,glide或者dep。那么go mod init同样也会根据依赖包管理配置文件来推断。

go mod tidy

默认情况下,Go不会移除go.mod文件中的无用依赖。所以当你的依赖中有些使用不到了,可以使用go mod tidy命令来清除它。
用法:go mod tidy [-v]它会添加缺失的模块以及移除不需要的模块。执行后会生成go.sum文件(模块下载条目)。添加参数-v,例如go mod tidy -v可以将执行的信息,即移除的模块打印到标准输出。

go mod vendor

用法:go mod vendor [-v],此命令会将build阶段需要的所有依赖包放到主模块所在的vendor目录中,并且测试所有主模块的包。同理go mod vendor -v会将添加到vendor中的模块打印到标准输出。

go mod verify

用法:go mod verify。此命令会检查当前模块的依赖是否已经存储在本地下载的源代码缓存中,以及检查自从下载下来是否有修改。如果所有的模块都没有修改,那么会打印all modules verified,否则会打印变化的内容。

虚拟版本号

go.mod文件和go命令通常使用语义版本作为描述模块版本的标准形式,这样可以比较不同版本的先后顺序。例如模块的版本是v1.2.3,那么通过重新对版本号进行标签处理,得到该版本的虚拟版本。如:
v0.0.0-yyyymmddhhmmss-abcdefabcdef。
其中时间是提交时的UTC时间,
最后的后缀是提交的哈希值前缀;
时间部分确保两个虚拟版本号可以进行比较,以确定两者顺序。
下面有三种形式的虚拟版本号:

vX.0.0-yyyymmddhhmmss-abcdefabcdef,
这种情况适合用在在目标版本提交之前 ,没有更早的的版本。(这种形式本来是唯一的形式,所以一些老的go.mod文件使用这种形式)

vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef,
这种情况被用在当目标版本提交之前的最新版本提交是vX.Y.Z-pre

vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef,这种情况是当目标版本提交之前的最新版本是vX.Y.Z

虚拟版本的生成不需要你去手动操作,go命令会将接收的commit哈希值自动转化为虚拟版本号。

你可能感兴趣的:(Go 1.11 moudel 介绍)