【Go】モジュール管理

2021.07.22
2024.03.24
プログラミング
GoGo Modules

はじめに

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

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

環境

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

1❯ go version
2go version go1.16 darwin/amd64

GOPATHとは

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

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

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

1> go env GOPATH

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

1❯ tree -L 3
2.
3├── bin
4│   ├── godoc
5│   ├── gopkgs
6│   └── gopls
7├── pkg
8│   ├── mod
9│   │   ├── cache
10│   │   ├── github.com
11│   │   ├── go.deanishe.net
12│   │   ├── golang.org
13│   │   ├── honnef.co
14│   │   └── mvdan.cc
15│   └── sumdb
16│       └── sum.golang.org
17└── src
18    └── golang.org
19        └── 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に追加しといたほうがいいみたいです。

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

Go Modules

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

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

1❯ go env GO111MODULE
2on

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

1❯ go env -w GO111MODULE=on

保管場所

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

1ls $GOPATH/pkg/mod
2cache           honnef.co
3github.com      mvdan.cc
4go.deanishe.net rsc.io
5golang.org

モジュール管理方法

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

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

1. ディレクトリの作成

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

1mkdir sample-modules

2. 初期化

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

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

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

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

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

1module sample-modules
2
3go 1.16

3. モジュールの取得

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

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

1package main
2
3import (
4    "fmt"
5    "rsc.io/quote"
6)
7
8func main() {
9    fmt.Println(quote.Hello())
10}

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

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

go get

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

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

1❯ go get rsc.io/quote
2go: downloading rsc.io/quote v1.5.2
3go: downloading rsc.io/sampler v1.3.0
4go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
5go get: added rsc.io/quote v1.5.2

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

1module sample-modules
2
3go 1.16
4
5require rsc.io/quote v1.5.2 // indirect
go mod tidy

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

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

4. モジュールの確認

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

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

5. ビルド

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

1❯ go build -o hello

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

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

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

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

1❯ go mod tidy

まとめ

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

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

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee