St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

【Golang】Go Modulesについて調べたのでまとめる

こんにちは。

最近、Goの勉強をせっせとしています。特に業務で使うわけでもなく、完全に趣味なのですが、楽しいのでやっています笑。

今回は、Go Modulesについて調べたのでまとめてみます。

Go Modulesとは

Go 1.11 から追加された外部パッケージの管理システムです。Go 1.11以前では、GOPATHの配下でソースコードを管理しないといけなかったのですが、その制限を解除することができます。

Go 1.11あたりでは、GOPATHモードとモジュールモードの二つがあったらしく*1、後でのべるgo.modファイルがあったとしても、$GOPATH/src配下にあった場合はGOPATHモードを使うなどがあったみたいですが、Go 1.13からはモジュールモードがデフォルトになったようです。

一通りチュートリアルなどを試してみた感じ、nodeとかで言うnpm、Pythonで言う所のpipenvとかに近いのかなぁと思いました。Goならでは感ある便利なところもあるなぁとか、バージョンの指定などは独特な感じもあるなぁとかはありますが、雰囲気似ています。

Go Modulesの使い方の流れ

使い方の流れとしては、以下の通りです。go mod initした後は、普通にgo build などを実行しているだけで、モジュールの管理をよしなにやってくれます。

1. $ go env -w GO111MODULE=onを設定する
2. $ go mod init
3. $ go build or $ go getなどでモジュールをインストールする
4. $ go mod tidy で使われてないモジュールを削除する
5. その他

以下、それぞれみていきたいと思います。

$ go env -w GO111MODULE=on

まず、以下のコマンドを打って、Go周りの環境変数を表示します。

$ go env

すると、何もしてないと、以下の変数の値がこのようになっているはずです。

GO111MODULE=

値が空欄になっている意味としては、GoのプロジェクトがGOPATHの配下に存在すれば=off、入っていなければ=onと言う風に解釈されると言うことです。

常にモジュールモードを使って欲しいので、onにしておきましょう。

$ go env -w GO111MODULE=on

これで、常にモジュールモードで解釈されるようになりました。

$ go mod init

自分のプロジェクトのルートディレクトリで、以下のコマンドを使います。

$ go mod init example-go-mod-test

すると、go.modファイルが作られます。

$ cat go.mod

# 以下、出力結果
module exaple-go-mod-test

go 1.14

$ go build or $ go getなどでモジュールをインストールする

すでにルートディレクトリ配下で、goのコードが書かれていれば、 $ go buildなどのコマンドを打つことによって、依存ライブラリをよしなにインストールしてくれます。

例えば、 hello.goと言うファイルに、以下のコードを書いたとします。ちなみに、このコードはこちらから使わせていただいております。

package hello

import "rsc.io/quote"

func Hello() string {
    return quote.Hello()
}

このファイルがある状態で、$ go buildをしてみます。

$ go build                      

# 以下、出力結果
go: finding module for package rsc.io/quote
go: found rsc.io/quote in rsc.io/quote v1.5.2

ここで、go.modファイルをみてみます。

$ cat go.mod

# 出力結果
module exaple-go-mod-test

go 1.14

require rsc.io/quote v1.5.2

こんな感じでモジュールをよしなに扱ってくれます。また、これは$ go getでモジュールを追加したりした場合にも、同じくやってくれます。

$ go mod tidy で使われてないモジュールを削除する

$ go mod tidyをすることで、使われていない依存モジュールを削除することができます。先ほどの、hello.goをルートディレクトリ配下から消した上で、このコマンドを使ってみます。

$ rm hello.go
$ go mod tidy
$ cat go.mod 

## 以下、出力結果
module exaple-go-mod-test

go 1.14

その他

Goのモジュールのバージョン指定についてや、自動でインストールされるモジュールのバージョンについては、取り決めがあるようですが、それについては公式のドキュメントが参考になりましたので、貼っておきます。Pythonなどを使っているマンからすると少し違うものになるので、みておいたほうがいいかなと思います。

よく使うコマンドリスト(自分用)

# go.modファイルの初期化
$ go mod init <module-name>

# モジュールのインストール
$ go get <package>

# 不要なモジュールのお掃除用
$ go mod tidy

# 使っているモジュールのリストアップ
$ go list -m all

# moduleのバージョンのリストアップ
$ go list -m -versions <module>

今日はそんな感じで。それでは。

*1:私が真面目に使い始めたのが、最近だからわからないので、ドキュメントに書いてあることをのべる笑