【Go】モジュール管理

はじめに

Goのモジュール管理について、どう管理するのか、GOPATHはどう関係あったのか、そもそもGOPATHってなんだっけっていうところから学び直したので、まとめたいと思います。

今回利用するGoのバージョンは1.16のため、Go Modulesでのモジュール管理について解説しています。

環境

Goのバージョンは以下の通りです。

❯ go version
go version go1.16 darwin/amd64

GOPATHとは

まずは、GOPATHについて解説します。

GOPATHとは、Goのワークスペースを指定する環境変数となります。

デフォルトは$HOME/goが指定されており、設定の確認は以下でできます。

> go env GOPATH

GOPATH配下の構成は以下のようになっています。

❯ tree -L 3
.
├── bin
│   ├── godoc
│   ├── gopkgs
│   └── gopls
├── pkg
│   ├── mod
│   │   ├── cache
│   │   ├── github.com
│   │   ├── go.deanishe.net
│   │   ├── golang.org
│   │   ├── honnef.co
│   │   └── mvdan.cc
│   └── sumdb
│       └── sum.golang.org
└── src
    └── golang.org
        └── x

Go 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に追加しといたほうがいいみたいです。

export PATH=$PATH:$(go env GOPATH)/bin

Go Modules

バージョン1.11以降では、Go Modulesを使ってバージョン管理できるようになっています。

Go Modulesを利用するにはGO111MODULEがonになっている必要があります。

❯ go env GO111MODULE
on

1.16からはGO111MODULE=onがデフォルトになっていますが、offになっている場合は、以下のように環境変数の値を更新します。

❯ go env -w GO111MODULE=on

保管場所

Go Modulesでは、$GOPATH/pkg/modにモジュールが保管されます。

❯ ls $GOPATH/pkg/mod
cache           honnef.co
github.com      mvdan.cc
go.deanishe.net rsc.io
golang.org

モジュール管理方法

モジュール管理は以下のような流れになります。

  1. ディレクトリの作成
  2. 初期化
  3. モジュールの取得
  4. モジュールの確認
  5. ビルドする
  6. 不要なモジュールの削除

1. ディレクトリの作成

GOPATH以外の場所に任意のディレクトリを作成します

❯ mkdir sample-modules

2. 初期化

最初にGo Modulesの初期化します。

go mod init <モジュール名>の形式で初期化します。

今回はテスト用なのでテキトーな名前をつけていますが、公式ドキュメントではgo mod init github.com/my/repoのような例が示されています。このモジュール名はimportするときのパスになります。

❯ go mod init sample-modules
go: creating new go.mod: module sample-modules

初期化が完了すると、go.modが作成されます。依存関係のモジュールはこのファイルに記載されていきます。

module sample-modules

go 1.16

3. モジュールの取得

初期化が完了したら、実際に開発をしながら、モジュールの取得をします。

ここでは以下のようなhello.goというファイルを作成しました。

package main

import (
    "fmt"
    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}

モジュールの取得はgo getもしくはgo mod tidyを利用します。

バージョン1.16からgo buildgo testしてもgo.modが変更されなくなりました。

go get

まずはgo getでモジュール取得をしてみます。

モジュール名を指定してモジュールの取得をします。

❯ go get rsc.io/quote
go: downloading 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
go get: added rsc.io/quote v1.5.2

go.modを確認すると必要なモジュールが追記されていることがわかります。

module sample-modules

go 1.16

require rsc.io/quote v1.5.2 // indirect
go mod tidy

go mod tidyを利用するとgo.modに必要なモジュールの追加と不必要なモジュールの削除をしてくれます。

❯ go mod tidy
go: finding module for package rsc.io/quote
go: found rsc.io/quote in rsc.io/quote v1.5.2

4. モジュールの確認

依存しているモジュールの確認をしてみます。

❯ go list -m all
sample-modules
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote v1.5.2
rsc.io/sampler v1.3.0

5. ビルド

go.modにモジュールの追加されているとビルドできるようになります。

❯ go build -o hello

go.modにモジュールが不足しているとエラーが出てしまいます。

❯ go build -o hello
hello.go:5:5: no required module provides package rsc.io/quote; to add it:
    go get rsc.io/quote

6. 不要なモジュールの削除

go.modに不要なモジュールが記載されている場合はgo mod tityで削除します。

❯ go mod tidy

まとめ

Go Modulesでモジュール管理ができます。

  1. ディレクトリの作成
  2. 初期化
  3. モジュールの取得
  4. モジュールの確認
  5. ビルドする
  6. 不要なモジュールの削

参考

タイトルとURLをコピーしました