関連記事

【Typescript】Next.js + MDXでブログ開発

【Python】datetimeの基本的な使い方

Backstageのバージョンをアップグレードする





Goのモジュール管理について、どう管理するのか、GOPATHはどう関係あったのか、そもそもGOPATHってなんだっけっていうところから学び直したので、まとめたいと思います。
今回利用するGoのバージョンは1.16のため、Go Modulesでのモジュール管理について解説しています。
Goのバージョンは以下の通りです。
1❯ go version
2go version go1.16 darwin/amd64まずは、GOPATHについて解説します。
GOPATHとは、Goのワークスペースを指定する環境変数となります。
デフォルトは$HOME/goが指定されており、設定の確認は以下でできます。
1> go env GOPATHGOPATH配下の構成は以下のようになっています。
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 └── xGo 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バージョン1.11以降では、Go Modulesを使ってバージョン管理できるようになっています。
Go Modulesを利用するにはGO111MODULEがonになっている必要があります。
1❯ go env GO111MODULE
2on1.16からはGO111MODULE=onがデフォルトになっていますが、offになっている場合は、以下のように環境変数の値を更新します。
1❯ go env -w GO111MODULE=onGo Modulesでは、$GOPATH/pkg/modにモジュールが保管されます。
1❯ ls $GOPATH/pkg/mod
2cache honnef.co
3github.com mvdan.cc
4go.deanishe.net rsc.io
5golang.orgモジュール管理は以下のような流れになります。
GOPATH以外の場所に任意のディレクトリを作成します
1❯ mkdir sample-modules最初に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初期化が完了したら、実際に開発をしながら、モジュールの取得をします。
ここでは以下のような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でモジュール取得をしてみます。
モジュール名を指定してモジュールの取得をします。
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.2go.modを確認すると必要なモジュールが追記されていることがわかります。
1module sample-modules
2
3go 1.16
4
5require rsc.io/quote v1.5.2 // indirectgo 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依存しているモジュールの確認をしてみます。
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.0go.modにモジュールの追加されているとビルドできるようになります。
1❯ go build -o hellogo.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/quotego.modに不要なモジュールが記載されている場合はgo mod tityで削除します。
1❯ go mod tidyGo Modulesでモジュール管理ができます。