使用 go modules功能
使用go modules功能的前提条件,二选一
- 安装golang 1.11以上版本
- 源码安装golang master分支源码 安装完以上组件以后,你就能够激活go modules功能了,激活方法有两种:
- go在$GOPATH/src目录之外执行go命令,创建go.mod文件
- 设置环境变量GO111MODULE=on,执行go命令
概念介绍
这本主要讲一个写go modules引入的新概念,你尅话四十分钟了解一下官方文档,或者花40分钟看下这个视频,或者看下更加详细的博客 。
Modules
Modules是一组功能相关的golang包,他们被统一的版本管理起来。大部分情况下,我们是一个仓库一个版本管理,但是现在我们希望一个仓库能够同时版本管理多个Module。 Modules record precise dependency requirements and create reproducible builds.
Modules 精准的记录了依赖关系,保证了项目可重复编译。Modules同时也是语义化的版本管理,例如:v0.1.0, v1.2.3, or v3.0.1。这个前置 v
字符是必须要求有的,如果是使用git来管理版本,那么这应该就是git tag 。
go.mod
Modules使用 go.mod 文件记录了源码的代码结构,并且他不要求你的代码必须在GOPATH中。在 go.mod 中所有的Module都有一个前缀:模块的路径。使用module
字段来定义一个新的Module,例如:里面包含两个 package
,example.com/my/thing/foo
和 example.com/my/thing/bar
,那么 go.mod 文件里面第一行因该是 module example.com/my/thing
。
就是golang代码一样,Modules文件里面也可以加入一些注释。下面是一个 go.mod 文件的例子:
module github.com/my/module/v3
require (
github.com/some/dependency v1.2.3
github.com/another/dependency v0.1.0
github.com/additional/dependency/v4 v4.0.0
)
Module定义文件一共有四个指令: module
, require
, exclude
, replace
。
exclude
和 replace
一般只用在主Module里面,exclude
和 replace
使用在非主Modules里面的时候会被忽略。在源码中,我们通过完整的路径来导入导入一个 Module,例如:
import "example.com/my/module/v2/pkg/foo
我们从example.com/my/module
这个Module
中导入foo
这个package
,并且指定他的版本是v2
版本。
版本选择
如果你在你的代码中导入了一个的package
,但是这个它还没有被加入到go.mod
文件中,那么在当前目录下,任何go
命令(go build)都会触发更新go.mod文件,会自动查找合适版本的Module
到go.mod
文件中,通过require
指引来引用这个Module