Go言語のパッケージ管理方法(GOPATHモードとmodule-awareモード)について理解を深める

Go言語

Go言語の勉強を始めたのですが、パッケージ管理の歴史的背景を知らず混乱したため、パッケージ管理方法についてまとめました。

なお、この記事は2021年5月現在(Go 1.16.3)の情報です。

Go言語のパッケージ管理方法について

Go言語のパッケージ管理方法にはGOPATHモードとmodule-awareモードの2種類が存在します。

GOPATHモードについて

Go 1.10までのパッケージ管理方法です。
$GOPATH/src配下にパッケージをcloneすることで管理します。

GOPATHモード時代にはglidedepgovendorといったパッケージ管理ツールが利用されていました。

module-awareモードについて

Go Modulesを利用したパッケージ管理方法です。現在はmodule-awareモードが標準となっています。
go.modgo.sumを利用してパッケージをモジュールという形で管理し、$GOPATH/pkg配下にパッケージを保存します。

これからGo言語を学習する場合は、module-awareモード(= Go Modulesを利用したパッケージ管理方法)で開発をすることになります。

パッケージ管理方法の歴史について

Go言語のパッケージ管理の歴史についてまとめると以下のようになります。

Go 1.10まで

  • GOPATHモードのみ

Go 1.11から

  • GOPATHモードとmodule-awareモードが選択可能になる
  • モードの選択は環境変数GO111MODULEで行う
  • GO111MODULEon, off, autoの3種類から選択可能。onの場合はmodule-awareモード、offの場合はGOPATHモード
  • GO111MODULEのデフォルト値はautogo.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)やってます。フォローしてもらえるとうれしいです!

参考