Go Modulesとは何かを解説してみた

thumnail
2020-07-28

背景

業務でGoのパッケージをダウンロードしたときに、goのversion upなどの要素が絡み合って、僕のローカルのパッケージの依存関係がおかしくなってしまう場面に遭遇した。このとき先輩にGo Modulesに関するアドバイスやコマンドを教えてもらったのだが、再度情報を整理してこの記事に備忘録としてまとめておこうとおもう。

Go Modulesが導入される前のパッケージ管理

Go Modulesが導入される前、プロジェクトに固有なパッケージは$GOPATH/src/<プロジェクト名>/vendorに配置していた。プロジェクト内でパッケージを探すときは優先的に自分のブロジェクトの階層にあるvendorから探しに行く仕組みであった。

Go Modulesの公式サンプルコードでさらっ理解する

Go Modulesを扱うにあたって、まず初めに次のコマンドを実行する。

go mod init github.com/my/repo

これを実行するとgithub.com/my/repoというmodulesが生成される。ちなみにmodulesは複数のpackageの集合体である。またこの時、同時にgo.modというファイルも生成される。

$ cat go.mod
module github.com/my/repo

go 1.12

では次に適当なmain.goを用意する。

$ cat main.go

package main

import (
    "fmt"

    "rsc.io/quote"
)

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

ここでgo buildを実行してみる。

go build -o hello

main.goでimportしたrsc.io/quoteのパッケージが$GOPATH/pkg/modにダウンロードされる。

$ cd $GOPATH/pkg/mod | ls | grep rsc.io
rsc.io

Go Modulesにおいてダウンロードしたパッケージは$GOPATH/pkg/modに配置される。またgo buildなどによってパッケージをダウンロードした場合、ダウンロードしたパッケージの依存関係を記録するためのgo.sumが自動更新される。

$ cat go.sum
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

go.modにどのパッケージをダウンロードしたのかが記録される。versionを指定しない場合は最新のversionがダウンロードされる。

$ cat go.mod
module github.com/my/repo

go 1.12

require rsc.io/quote v1.5.2

ダウンロードするパッケージのversionを指定したい場合はgo.modにダウンロードするパッケージのversionを指定すれば良い。ではminor versionを1つ下げるように設定した後、go buildを実行する。

$ cat go.mod
module github.com/my/repo

go 1.12

require rsc.io/quote v1.5.1
$ go build
go: finding rsc.io/quote v1.5.1
go: downloading rsc.io/quote v1.5.1
go: extracting rsc.io/quote v1.5.1

結果としてrsc.io/quote v1.5.1がダウンロードされたことがわかる。

Go Modules関連のコマンド

次のgo get -uコマンドでパッケージをダウンロードしたときはそのパッケージの最新versionと依存パッケージの最新versionをダウンロード&インストールする。

go get -u example.com/package

明示的にパッケージをインストールしたとき、実際には使用していないパッケージが残ってしまったりする。その場合次のコマンドを実行することで、使用していないパッケージを削除することができる。

go mod tidy

参考サイト

https://github.com/golang/go/wiki/Modules#example https://qiita.com/propella/items/e49bccc88f3cc2407745

profile

KATUO

web developer

六本木で月間利用者数数千万のサービスを運営するミドルベンチャーでWeb系エンジニアをやってます。フロントエンドはVue.js/Nuxt.js,サーバーサイドはGolang, クラウドはAWS, GCPを良く扱います。お仕事・イベント等の依頼はContactのフォームからお願いします。

KATUBLO

Copyright since 2018 KATUO All Rights Reserved.