【Go】モジュール管理
はじめに
Goのモジュール管理について、どう管理するのか、GOPATHはどう関係あったのか、そもそもGOPATHってなんだっけっていうところから学び直したので、まとめたいと思います。
今回利用するGoのバージョンは1.16のため、Go Modulesでのモジュール管理について解説しています。
環境
Goのバージョンは以下の通りです。
1❯ go version
2go version go1.16 darwin/amd64
GOPATHとは
まずは、GOPATHについて解説します。
GOPATHとは、Goのワークスペースを指定する環境変数となります。
デフォルトは$HOME/go
が指定されており、設定の確認は以下でできます。
1> go env GOPATH
GOPATH配下の構成は以下のようになっています。
1❯ tree -L 3
2.
3├── bin
4│ ├── godoc
5│ ├── gopkgs
6│ └── gopls
7├── pkg
8│ ├── mod
9│ │ ├── cache
10│ │ ├── github.com
11│ │ ├── go.deanishe.net
12│ │ ├── golang.org
13│ │ ├── honnef.co
14│ │ └── mvdan.cc
15│ └── sumdb
16│ └── sum.golang.org
17└── src
18 └── golang.org
19 └── x
Go Modulesが使えるようになるまでは、GOPATHを利用したパッケージ管理がされていました。また、その関係で$GOPATH/src
配下でしか開発ができなかったみたいです。
ですが、Go Modulesが使えるようになってからは、Go Modulesを使う場合はGOPATH以外の任意のディレクトリでの開発ができるようになりました。
Go Modulesを使うときはGOPATH配下は以下のように使われます。
go install
した時のインストール先($GOPATH/bin
)go get
した時のモジュールダウンロード先($GOPATH/pkg/mod
)
また、go install
したバイナリが使えるように$GOPATH/bin
をPATHに追加しといたほうがいいみたいです。
1export PATH=$PATH:$(go env GOPATH)/bin
Go Modules
バージョン1.11以降では、Go Modulesを使ってバージョン管理できるようになっています。
Go Modulesを利用するにはGO111MODULE
がonになっている必要があります。
1❯ go env GO111MODULE
2on
1.16からはGO111MODULE=on
がデフォルトになっていますが、offになっている場合は、以下のように環境変数の値を更新します。
1❯ go env -w GO111MODULE=on
保管場所
Go Modulesでは、$GOPATH/pkg/mod
にモジュールが保管されます。
1❯ ls $GOPATH/pkg/mod
2cache honnef.co
3github.com mvdan.cc
4go.deanishe.net rsc.io
5golang.org
モジュール管理方法
モジュール管理は以下のような流れになります。
- ディレクトリの作成
- 初期化
- モジュールの取得
- モジュールの確認
- ビルドする
- 不要なモジュールの削除
1. ディレクトリの作成
GOPATH以外の場所に任意のディレクトリを作成します
1❯ mkdir sample-modules
2. 初期化
最初にGo Modulesの初期化します。
go mod init <モジュール名>
の形式で初期化します。
今回はテスト用なのでテキトーな名前をつけていますが、公式ドキュメントではgo mod init github.com/my/repo
のような例が示されています。このモジュール名はimportするときのパスになります。
1❯ go mod init sample-modules
2go: creating new go.mod: module sample-modules
初期化が完了すると、go.mod
が作成されます。依存関係のモジュールはこのファイルに記載されていきます。
1module sample-modules
2
3go 1.16
3. モジュールの取得
初期化が完了したら、実際に開発をしながら、モジュールの取得をします。
ここでは以下のようなhello.go
というファイルを作成しました。
1package main
2
3import (
4 "fmt"
5 "rsc.io/quote"
6)
7
8func main() {
9 fmt.Println(quote.Hello())
10}
モジュールの取得はgo get
もしくはgo mod tidy
を利用します。
バージョン1.16から
go build
やgo test
してもgo.modが変更されなくなりました。
go get
まずはgo get
でモジュール取得をしてみます。
モジュール名を指定してモジュールの取得をします。
1❯ go get rsc.io/quote
2go: downloading rsc.io/quote v1.5.2
3go: downloading rsc.io/sampler v1.3.0
4go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
5go get: added rsc.io/quote v1.5.2
go.modを確認すると必要なモジュールが追記されていることがわかります。
1module sample-modules
2
3go 1.16
4
5require rsc.io/quote v1.5.2 // indirect
go mod tidy
go mod tidy
を利用するとgo.modに必要なモジュールの追加と不必要なモジュールの削除をしてくれます。
1❯ go mod tidy
2go: finding module for package rsc.io/quote
3go: found rsc.io/quote in rsc.io/quote v1.5.2
4. モジュールの確認
依存しているモジュールの確認をしてみます。
1❯ go list -m all
2sample-modules
3golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
4rsc.io/quote v1.5.2
5rsc.io/sampler v1.3.0
5. ビルド
go.modにモジュールの追加されているとビルドできるようになります。
1❯ go build -o hello
go.modにモジュールが不足しているとエラーが出てしまいます。
1❯ go build -o hello
2hello.go:5:5: no required module provides package rsc.io/quote; to add it:
3 go get rsc.io/quote
6. 不要なモジュールの削除
go.modに不要なモジュールが記載されている場合はgo mod tity
で削除します。
1❯ go mod tidy
まとめ
Go Modulesでモジュール管理ができます。
- ディレクトリの作成
- 初期化
- モジュールの取得
- モジュールの確認
- ビルドする
- 不要なモジュールの削
参考
- GOPATH · golang/go Wiki
- Modules · golang/go Wiki
- Go 1.16 Release Notes - The Go Programming Language
- Go Modules Reference - The Go Programming Language