What’s "go mod" ?
ざっくりと
- モジュール管理ができるやつだよー
- go1.12から使えるよー
というもの
Why need "go mod" ?
- 外部パッケージを使ってる時、バージョンの管理簡単にできるよー
- 今まではvenderディレクトリで管理するのが主流っぽいよー
- 私の場合はdockerを利用してCIするときに、go get全部書くのが面倒だったから入れたよー
How to use?
-
GO111MODULE=on
を設定しておくよー (v1.12ではこれしないと上手く動かないことあるよー) - 開発してる環境で
go mod init プロジェクトパス
を叩くとmodファイルつくるよー - パッケージを管理したいgoファイルをgo build するよー
- go.modに使ってるモジュールが自動で入力されるよー
- バージョン上げたければ go getするといいよー
Let's Try!
例えば、↓みたいな簡単な「gin」を用いたクライアントサーバーを立ち上げるパッケージがあったとします
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
ここで使ってるパッケージは gin-gonic/gin
ですねー
とすると、 gin-gonic/gin
のバージョンをmodで管理できると楽ですよねー
まずは modファイルを作っていきますー
$ go mod init main
go: creating new go.mod: module main
$ ls
go.mod main.go
プロジェクト名は本当は$GOPATHでのパスを設定するのが良さそうですよー
でも今回は動作テストのために適当な名前をつけてますー
中身を確認すると
$ cat go.mod
module main
go 1.12
こんな感じになってますー
次はbuildしたあとに中身を確認しますよー
$ cat go.mod
module main
go 1.12
require (
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 // indirect
github.com/gin-gonic/gin v1.3.0
github.com/golang/protobuf v1.3.1 // indirect
github.com/mattn/go-isatty v0.0.7 // indirect
github.com/ugorji/go/codec v0.0.0-20190320090025-2dc34c0b8780 // indirect
gopkg.in/go-playground/validator.v8 v8.18.2 // indirect
gopkg.in/yaml.v2 v2.2.2 // indirect
)
なんかすごく色々増えてることがわかりますねー
gin-gonic/gin でサーバーを立ち上げる時に利用しているパッケージをまとめて管理してくれてるようですねー
ちなみに、↑のように色々パッケージが書かれているmodファイルがあれば、go buildするときに勝手に足りないパッケージをDLしてくれますよー