Go1.11提供了实验性的module的功能。

创建Module

在Go1.11中创建Module分为在GOPATH中和在GOPATH外两种情况,在GOPATH中创建时,需要设置环境变量GO111MODULE=on。

在GOPATH中创建module:

1
2
3
4
$ export GO111MODULE=on
$ cd $GOPATH/github.com/your/hellomod
$ go mod init gihub.com/your/hellomod
go: creating new go.mod: module github.com/your/hellomod

这一步会在当前目录下创建一个go.mod文件,其内容为

1
module github.com/your/hellomod
编码

接下来在hellomod中写入代码

1
2
3
4
5
6
7
8
9
10
11
// hello.go
package hellomod

import (
"fmt"
)

// Meow ~
func Meow() {
fmt.Println("meow ~")
}

如果在hellomod中依赖了其它的第三方包,在这个module的根目录使用go build 或者使用go mod tidy来获取依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
package hellomod

import (
"fmt"

"github.com/gorilla/websocket"
)

// Meow ~
func Meow() {
fmt.Println("meow ~")
fmt.Println(websocket.PingMessage)
}

此时会在go.mod中添加依赖,并声称go.sum文件

1
2
3
4
// go.mod
module github.com/your/hellomod

require github.com/gorilla/websocket v1.4.0
1
2
3
// go.sum
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=

然后将代码和go.mod和go.sum一起提交到远程仓库。

版本管理

module版本化遵循semver version

因为module使用的是仓库的Tag来标记版本,所以还需要发布一个版本

1
2
$ git tag v1.0.0
$ git push --tags

最好再给v1版本单独创建一个分支

1
2
$ git checkout -b v1
$ git push -u origin v1

使用Module

工作流
  • 在.go文件中直接import包

  • 无需go get,直接go build或者go test或者go mod tidy拉取依赖

    其中拉取下来的依赖在$GOPATH/pkg/mod中

  • 使用go list -m all查看所有直接和间接的依赖。

  • 指定版本支持的命令格式有go get [email protected], go get [email protected], go get [email protected], 或者直接修改go.mod文件

  • 使用go mod vendor把项目的依赖存入vendor目录中,使用go build -mod vendor使用vendor目录的依赖编译

  • 使用go get -u来更新到最新版本,使用go get -u=patch更新最新的补丁版本

参考

https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies

https://roberto.selbach.ca/intro-to-go-modules/