Go言語の勉強を始めたのですが、パッケージ管理の歴史的背景を知らず混乱したため、パッケージ管理方法についてまとめました。
なお、この記事は2021年5月現在(Go 1.16.3)の情報です。
目次
Go言語のパッケージ管理方法について
Go言語のパッケージ管理方法にはGOPATHモードとmodule-awareモードの2種類が存在します。
GOPATHモードについて
Go 1.10までのパッケージ管理方法です。
$GOPATH/src
配下にパッケージをcloneすることで管理します。
GOPATHモード時代にはglideやdep、govendorといったパッケージ管理ツールが利用されていました。
module-awareモードについて
Go Modulesを利用したパッケージ管理方法です。現在はmodule-awareモードが標準となっています。
go.mod
とgo.sum
を利用してパッケージをモジュールという形で管理し、$GOPATH/pkg
配下にパッケージを保存します。
これからGo言語を学習する場合は、module-awareモード(= Go Modulesを利用したパッケージ管理方法)で開発をすることになります。
パッケージ管理方法の歴史について
Go言語のパッケージ管理の歴史についてまとめると以下のようになります。
Go 1.10まで
- GOPATHモードのみ
Go 1.11から
- GOPATHモードとmodule-awareモードが選択可能になる
- モードの選択は環境変数
GO111MODULE
で行う GO111MODULE
はon
,off
,auto
の3種類から選択可能。on
の場合はmodule-awareモード、off
の場合はGOPATHモードGO111MODULE
のデフォルト値はauto
(go.mod
の有無と、$GOPATH/src
の内容をもとに適切なモードが選択される)
Go 1.16から
GO111MODULE
のデフォルト値がon
になる。つまり、Go Modulesを利用するmodule-awareモードが標準となる。
パッケージ管理方法と$GOPATHについて
$GOPATH
配下に作成されるsrc
, pkg
, bin
ディレクトリについて説明します。
srcディレクトリ
GOPATHモードで利用されるディレクトリです。
module-awareモードを利用している場合、src
ディレクトリは不要ですし作成もされません。
pkgディレクトリ
go get
もしくはgo mod tidy
でパッケージをインストールした時の保存場所です。
たとえば、以下のようなmain.go
の依存パッケージをgo mod tidy
でインストールした実行結果は以下の通りです。
main.go
package main
import (
"fmt"
"rsc.io/quote" // ← 依存パッケージ
)
func main() {
fmt.Println(quote.Hello())
}
### go.modファイルの作成
$ go mod init example
go: creating new go.mod: module example
### go.modとmain.goが存在するディレクトリでgo mod tidyを実行
$ ls
go.mod main.go
$ go mod tidy
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: found rsc.io/quote in rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
### 依存パッケージが $GOPATH/pkg 配下に保存される
$ ls $GOPATH/pkg/mod/
cache golang.org rsc.io
binディレクトリ
go get
もしくはgo install
で実行ファイルをグローバルインストールした時の保存場所です。
たとえば、Go言語のホットリロードツール『Air』をgo install
でインストールした結果は以下の通りです。
### go installでairコマンドをインストール
$ go install github.com/cosmtrek/air@latest
go: downloading github.com/cosmtrek/air v1.27.3
go: downloading github.com/creack/pty v1.1.11
go: downloading github.com/fatih/color v1.10.0
go: downloading github.com/fsnotify/fsnotify v1.4.9
go: downloading github.com/imdario/mergo v0.3.12
go: downloading github.com/pelletier/go-toml v1.8.1
go: downloading github.com/mattn/go-isatty v0.0.12
go: downloading github.com/mattn/go-colorable v0.1.8
go: downloading golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae
### $GOPATH/bin 配下にインストールされる
$ which air
/go/bin/air
実行ファイルのデフォルトの保存場所は$GOPATH/bin
ですが、環境変数GOBIN
によって変更可能です。
なお、Go 1.17以降ではgo get
による実行ファイルのインストール機能は廃止される予定のようです。1
まとめ
- Go言語のパッケージ管理方法には『GOPATHモード』と『module-awareモード』がある
- 現在はGo Modulesを利用したmodule-awareモードが標準
- glideやdep、govendorを利用したパッケージ管理はGOPATHモード時代の話
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!