时间:2021-05-22
Go1.1.1版本发布(2018-08-24发布)已经过去几天,从官方的博客中看到,有两个比较突出的特色,一个就是今天讲的module,模块概念。目前该功能还在试验阶段,有些地方还需要不断的进行完善。在官方正式宣布之前,打算不断修正这种支持。到时候就可以移除对GOPATH和go get命令的支持。
如果你想现在想就试试这个新功能module,需要你将你的代码仓库放到GOPATH/src目录之外。然后在那个目录下创建一个go.mod文件,从文件树中运行go命令。
主要概念介绍
module是一个相关Go包的集合,它是源代码更替和版本控制的单元。模块由源文件形成的go.mod文件的根目录定义,包含go.mod文件的目录也被称为模块根。moudles取代旧的的基于GOPATH方法来指定在工程中使用哪些源文件或导入包。模块路径是导入包的路径前缀,go.mod文件定义模块路径,并且列出了在项目构建过程中使用的特定版本。
go.mod文件
go.mod文件定义module路径以及列出其他需要在build时引入的模块的特定的版本。例如下面的例子中,go.mod声明example.com/m路径时module的根目录,同时也声明了module依赖特定版本的golang.org/x/text和gopkg.in/yaml.v2。
module example.com/mrequire ( golang.org/x/text v0.3.0 gopkg.in/yaml.v2 v2.1.0)go.mod文件还可以指定要替换和排除的版本,命令行会自动根据go.mod文件来维护需求声明中的版本。如果想获取更多的有关go.mod文件的介绍,可以使用命令go help go.mod。
go.mod文件用//注释,而不用。文件的每行都有一条指令,由一个动作加上参数组成。例如:
上面三个动词require、exclude、replace分别表示:项目需要的依赖包及版本、排除某些包的特别版本、取代当前项目中的某些依赖包。
相同动作的命令可以放到一个动词+括号组成的结构中,例如:
其他命令的支持
旧的版本,构建编译命令go build中的参数没有-mod参数,最新的版本现在多了这个,用来对go.mod文件进行更新或其他使用控制。形式如:go build -mod [mode],其中mode有以下几种取值:readonly,release,vendor。当执行go build -mod=vendor的时候,会在生成可执行文件的同时将项目的依赖包放到主模块的vendor目录下。
go get -m [packages]会将下载的依赖包放到GOPATH/pkg/mod目录下,并且将依赖写入到go.mod文件。go get -u=patch会更新主模块下的所有依赖包。
如果遇到不熟悉的导入包,任何可以查找包含该引入包模块的go命令,都会自动将该模块的最新版本添加到go.mod文件中。同时也会添加缺失的模块,以及删除无用的module。例如:go build, go test或者go list命令。另外,有一个专门的命令go mod tidy,用来查看和添加缺失的module需求声明以及移除不必要的。
go.mod文件是可读,也是可编辑的。go命令行会自动更新go.mod文件来维持一个标准格式以及精确的引入声明。
Go mod命令
Go mod提供了一系列操作modules的命令,记住,所有的go命令中现在已经内置了对module的支持,而不仅仅是go mod命令。例如使用go get时,会经常自动在后台添加、移除、升级、降级依赖包版本。
命令语法:go mod <command> [arguments]。Go mod提供的命令有下面几个,对于比较常用的命令进行详细说明。
go mod download
用法:go mod download [-dir] [-json] [modules]。使用此命令来下载指定的模块,模块的格式可以根据主模块依赖的形式或者path@version形式指定。如果没有指定参数,此命令会将主模块下的所有依赖下载下来。
go mod download命令非常有用,主要用来预填充本地缓存或者计算Go模块代理的回答。默认情况下,下载错误会输出到标准输出,正常情况下没有任何输出。-json参数会以JSON的格式打印下载的模块对象,对应的Go对象结构是这样。
go mod init
用法:go mod init [module]。此命令会在当前目录中初始化和创建一个新的go.mod文件,当然你也可以手动创建一个go.mod文件,然后包含一些module声明,这样就比较麻烦。go mod init命令可以帮助我们自动创建,例如:
使用这条命令时,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时间,最后的后缀是提交的哈希值前缀。时间部分确保两个虚拟版本号可以进行比较,以确定两者顺序。
下面有三种形式的虚拟版本号:
虚拟版本的生成不需要你去手动操作,go命令会将接收的commit哈希值自动转化为虚拟版本号。
环境变量——GO111MODULE
Go 1.11中的module支持临时环境变量——GO111MODULE,它可以设置以下三个值:off,on或者auto(默认)。
具体使用步骤:
总结
到此这篇关于详解Go module的介绍及使用的文章就介绍到这了,更多相关Go module使用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Android中RxPermissions的使用方法详解以请求拍照、读取位置权限为例module的build.gradle:compile'com.tbruye
Golang与python线程详解及简单实例在GO中,开启15个线程,每个线程把全局变量遍历增加100000次,因此预测结果是15*100000=1500000
在没介绍正文之前先给大家补充点go语言基本知识及实例。Go语言教程Go是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由Ro
前言之前有一篇介绍如何使用Go语言通过SSH协议来执行远程命令:如何使用Go语言实现远程执行命令同样,通过SSH协议也可以使用Go语言来远程传输文件。除了SSH
jsthis函数详解本文对Javascriptthis函数进行详细介绍,及知识的总结整理,彻底明白jsthis函数该如何使用。this代码函数调用时,.1直接调