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/m require ( 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
文件用//
注释,而不用/**/
。文件的每行都有一条指令,由一个动作加上参数组成。例如:
module my/thing require other/thing v1.0.2 require new/thing v2.3.4 exclude old/thing v1.2.3 replace bad/thing v1.4.5 => good/thing v1.4.5
上面三个动词require
、exclude
、replace
分别表示:项目需要的依赖包及版本、排除某些包的特别版本、取代当前项目中的某些依赖包。
相同动作的命令可以放到一个动词+括号组成的结构中,例如:
require ( new/thing v2.3.4 old/thing v1.2.3 )
其他命令的支持
旧的版本,构建编译命令go build
中的参数没有-mod
参数,最新的版本现在多了这个,用来对go.mod
文件进行更新或其他使用控制。形式如:go build -mod [mode]
,其中mode有以下几种取值:readonly
,release
,vendor
。当执行go build -mod=vendor
的时候,会在生成可执行文件的同时将项目的依赖包放到主模块的vendo
r目录下。
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 module的介绍及使用
扫一扫手机访问
