【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:私が真面目に使い始めたのが、最近だからわからないので、ドキュメントに書いてあることをのべる笑