こんにちは、イサムです!
本記事では、Go言語の依存モジュール管理ツールGo Modulesについてまとめていきます。
- Go言語の依存モジュール管理ツールGo Modulesついて知りたい!
- Go言語の依存モジュール管理ツールGo Modulesついてのまとめ
Go Moudules
Go Modulesは、Go言語の依存モジュール管理ツールのことで、Go1.11から標準で使用することができるようになりました
Go1.11以前では、GOPATHの概念によりGoのソースコードやパッケージも含め全て$GOPATH配下で管理しなければなりませんでしたが、Go Modulesによりこの制限がなくなりました。
Go Modulesを使用することをモジュールモード、Goのソースコードやパッケージも含め全て$GOPATH配下で管理することをGOPATHモードと呼びます。
Go Modulesの機能は、以下の2つになり、後述するgo.modとgo.sumファイルで行います。
- 依存モジュールの自動検知
- 依存モジュールのバージョン固定とバージョンアップ検知
ライブラリ、パッケージ、モジュールの違いについては、下記のようなイメージになります。

GOPATHモード
Go1.10までのパッケージ管理方法。
標準パッケージを除く全てのパッケージのコード管理とビルドを環境変数GOPATHで指定されたディレクトリ配下で行うモードになります。
パッケージの管理はリポジトリの最新リビジョンのみが対象になります。
$ go env | grep GOPATH
GOPATH="/home/username/go"
GOPATH配下のディレクトリについて
src
GOPATHモードで利用されるディレクトリ。
モジュールモードの場合、srcディレクトリは不要。
pkg/mod
go installコマンドでパッケージをインストールした際の保存先ディレクトリ。(GOPATHモードでは、srcディレクトリに保存)
さらに、キャッシュも保存されます。だたし、Go言語1.15から環境変数GOMODECACHEが使用できるようになったたため、キャッシュの保存先を変更することができるようになりました。
go installコマンドなどは、このディレクトリを参照するものの、あくまでキャッシュ扱いなので、あれば使い、無ければインストールする挙動になります。
pkg/sumdb
Go1.13よりGo module proxyとGo checksum databaseという仕組みが導入され、Go Modulesがリポジトリをホスティングしているサービスに依存している問題や悪意のある攻撃者によりモジュールをすり替えられる問題に対応できるようになりました。
動作としては、go installコマンドなどでパッケージを取得する際に、module proxyに問い合わせてパッケージの情報を取得し、checksum databaseに問い合わせることでパッケージの完全性を確認します。
pkg/sumdbは、checksum databaseへ問い合わせた結果のキャッシュが保存されるディレクトリで、module proxyへ問い合わせた結果のキャッシュは、pkg/mod/cache配下に保存され、環境変数GOMODCACHEで変更可能です。
bin
go install で実行ファイルをグローバルインストールした際の保存先ディレクトリ。
実行ファイルのデフォルトの保存先は、$GOPATH/binですが、環境変数GOBINによって変更可能です。
モジュールモード
標準パッケージを除く全てのパッケージをモジュールとして管理するモード。
コード管理とビルドは任意のディレクトリで可能で、モジュールはリポジトリのバージョンタグまたはリビジョンごとに管理されます。
パッケージ
Go言語のコンパイラの処理単位で、具体的には1つのディレクトリ内のファイル群を1つのパッケージとして処理するということです。つまり、同じパッケージのソースコードは一緒にコンパイルされます。
別のパッケージを使用したい場合は、下記のようにパスで指定し、コンパイラは指定されたパスを見てパッケージを探します。
import "path/to/package"
最優先は、Go言語の標準パッケージで、GOPATHモードであれば環境変数GOPATHで指定されたディレクトリ以下を探します。
モジュールモードでは、環境変数GOCACHE、GOMODECACHEで指定されたディレクトリ配下を探します。
go installコマンドを使用して事前に外部パッケージをダウンロードしておくことで参照可能になります。
バイナリのインストール先
go installコマンドでビルドした実行バイナリのインストール先を$GOPATH/binディレクトリに配置しているが、これを環境変数GOBINで変更することができます。
$ go env -w GOBIN=/home/username/bin
$ go env | grep GOBIN
GOBIN="/home/username/bin"
モジュール
モジュール対応モードでは、標準パッケージを除くパッケージをモジュールとして管理します。パッケージが単一のディレクトリを指すのに対し、モジュールは、後述するgo.modファイルのあるディレクトリ以下の全てのパッケージがモジュールになります。
パッケージがGit等のバージョン管理ツールで管理されている場合、バージョン(またはリビジョン)毎に異なるパッケージとみなされるため、モジュールの実態は、「パッケージ + バージョン」ということになります。
モジュールのキャッシュ先
go buildコマンドなどでコンパイルした結果の中間バイナリを環境変数GOCACHEで指定したディレクトリにキャッシュし、可能な限り再利用します。
$ go env | grep GOCACHE
GOCACHE="/home/username/.cache/go-build"
go installコマンドなどでインポートしたモジュールのキャッシュは、$GOPATH/pkg/modディレクトリに配置されるが、環境変数GOMODCACHEで変更できるようになりました。
$ go env | grep GOMODCACHE
GOMODCACHE="/home/username/go/pkg/mod"
キャッシュのクリアは下記コマンドで実行できます。
$ go clean -cache
$ go clean -modcache
go.modファイル
go.modファイルは、モジュールのパスとバージョン情報を記述しておくファイルで、いくつかのディレクティブを使用して、アプリケーションがどのような依存関係を持っているかを記述しておくファイルになります。
module github.com/github-name/repository-name/app/users
go 1.16
replace github.com/github-name/app/middleware => ../middleware
require (
github.com/github-name/repository-name/app/middleware v0.0.0-00010101000000-000000000000
github.com/go-sql-driver/mysql v1.6.0
github.com/jinzhu/copier v0.3.5 // indirect
github.com/labstack/echo/v4 v4.6.3
github.com/pkg/errors v0.9.1 // indirect
github.com/rs/xid v1.3.0 // indirect
xorm.io/xorm v1.2.5
)
ディレクティブ
ディレクティブは、ソースコードに記述される要素の1つで、そのコードを解釈・変換するコンパイラなどへ指示を与えるためのものになります。
module
自分自身のモジュール名を定義するためのディレクティブで、go mod initコマンド指定したモジュール名が自動で設定されます。
go
モジュールの記述を想定しているGoのバージョンを定義するためのディレクティブで、ここに指定したバージョン以降に導入された言語仕様の機能を使用するとビルドエラーになります。
require
go.modファイルの中心的な表記となるディレクティブで、依存先モジュールのインポートパスやバージョンを指定します。go getコマンドで追記またはバージョン変更を行いますが、バージョンの変更程度であれば直接編集することもできます。
ここで指定するバージョンは、Gitのタグでありコミットハッシュを一意に特定できるため、go.modファイルのみで依存関係を定義できます。依存先のバージョンアップによってビルドが破壊されないように指定されたバージョンを下限として最も古いものを使用します。
Go1.17からは、このディレクティブが2つ書かれることがありますが、これは間接的依存先(依存先の依存先)が自動的に記述されるようになりました。
また、間接的な依存先には、//indirectが付きます。
バージョンに+incompatibleが付く場合がありますが、これは、メジャーバージョンとモジュール名のサフィックスが一致しない場合に表示されます。
具体的な例としては、v4.0.0というタグが付いているのに、モジュールの末尾がgithub.com/xxx/yyyとなっているケースです。Go Moduleのバージョン管理ルールでは、バージョン管理ルールではバージョンがv4.x.yであれば、github.com/xxx/yyy/v4となっていなければなりません。
replace
モジュールのインポートパスを別の場所に置き換えるためのディレクティブになります。
同一リポジトリ内に複数のモジュールがある場合に使用し、相対パスで指定して、ローカルのモジュールをインポートできるようになります。
exclude
特定のモジュールを除外し、使用しないようにできるディレクティブになります。
これを使用することで、依存先のバグや脆弱性のあるバージョンを意図せずに使用することを防止できますが、制御対象となるのは、直接依存のモジュールのみで間接依存に対しては制御することはできません。
retract
Go1.16から導入されたディレクティブで一度公開したモジュールを撤回するためのディレクティブで、間違えて公開したり脆弱性が発覚したりして利用を停止する場合に使用します。
Gitのタグを削除したり付け替えたりすることは破壊的変更が発生し、すでにインポートしてしまったビルドが壊れることになるので避けたほうが良いので、その際にこれを使用します。
go.sumファイル
直接・間接を問わず依存先モジュールのSHA-256チェックサム値を記録するためのファイルです。go.modファイルとともにリポジトリにpushされビルド再現性のために利用されますが、モジュールの取得はgo.modファイルのrequireディレクティブにある情報で完結できるため、go.sumファイル自体は無くともビルド再現性は得られます。
go.sumファイルが必要な理由としては、go.modファイルをもとに取得したモジュールが本当にgo.sumファイル生成時のものと一致しているかのチェックのためにあり、インポートするモジュールの完全性を担保するものになります。悪意のある第三者がリポジトリやGithubアカウントを乗っ取って同じバージョンタグでマルウェアを仕込んだ場合、取得してきたモジュールのハッシュとgo.sumファイルに記録されたハッシュが異なるためエラーを検知できます。
下記が実際のgo.sumファイルになります(go.modファイルに対するgo.sumファイル)が、人間が解釈できる内容にはなっていないため、手作業ではなく、go mod tidyコマンドを使用して編集します。
require (
github.com/labstack/echo/v4 v4.7.2 // indirect
github.com/labstack/gommon v0.3.1 // indirect
github.com/mattn/go-colorable v0.1.11 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.1 // indirect
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b // indirect
golang.org/x/text v0.3.7 // indirect
)
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/labstack/echo/v4 v4.7.2 h1:Kv2/p8OaQ+M6Ex4eGimg9b9e6icoxA42JSlOR3msKtI=
github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks=
github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o=
github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs=
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
golang.org/x/crypto v0.0.0-20210817164053-32db79AC4688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b h1:1VkfZQv42XQlA/jchYumAnv1UPo6RgF9rJFkTgZIxO4=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Go Modulesの使い方
Go Modulesの使い方の流れとして、以下の順番で行います。
- モジュールモードへの切替
- go.modファイルの作成
- go.modファイルの編集
- モジュールのインストールとバージョンアップ
- 使用されていないモジュールの削除
モジュールモードへの切替
Go1.11以降では、2つのモードの切り替えのために、環境変数GO111MODULEが用意され、モードの変更ができるようになりました。
$ go env | grep GO111MODULE
GO111MODULE=""
GO111MODULEは、下記の値を取ります。
値 | 説明 |
---|---|
on または 空 | 常にモジュールモードで動作 |
off | 常にGOPATHモードで動作 |
auto | $GOPATH/src以下のディレクトリに配置され、go.modファイルを含まないパッケージはGOPATHモードで、それ以外はモジュールモードで動作 |
go.modファイルの作成
go mod initコマンドで作成できます。
$ go mod init github.com/github-name/repository-name/app/users
go: creating new go.mod: github.com/github-name/repository-name/app/users
モジュール名github.com/github-name/repository-name/app/usersとして、カレントディレクトリ直下にgo.modファイルが作成されます。
module github.com/github-name/repository-name/app/users
go 1.17
go.modファイルの編集
go getコマンドで使用するモジュールとそのバージョンをgo.modファイルに追記します。ただし、モジュールのインストールはされません。
go getコマンドの引数にモジュールを指定しなかった場合、ソースコードの中で使用されているがgo.modに記載されていないモジュールをgo.modに反映します。
Go1.16までは、go getコマンドによるモジュールのインストール、go buildやgo testコマンドによるgo.modファイルの自動編集ができましたがそれ以降はできなくなりました。
$ go get github.com/labstack/echo/v4
go: added github.com/labstack/echo/v4 v4.7.2
go: added github.com/labstack/gommon v0.3.1
go: added github.com/mattn/go-colorable v0.1.11
go: added github.com/mattn/go-isatty v0.0.14
go: added github.com/valyala/bytebufferpool v1.0.0
go: added github.com/valyala/fasttemplate v1.2.1
go: added golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
go: added golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f
go: added golang.org/x/sys v0.0.0-20211103235746-7861aae1554b
go: added golang.org/x/text v0.3.7
require (
github.com/labstack/echo/v4 v4.7.2 // indirect
github.com/labstack/gommon v0.3.1 // indirect
github.com/mattn/go-colorable v0.1.11 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.1 // indirect
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b // indirect
golang.org/x/text v0.3.7 // indirect
)
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/labstack/echo/v4 v4.7.2 h1:Kv2/p8OaQ+M6Ex4eGimg9b9e6icoxA42JSlOR3msKtI=
github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks=
github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o=
github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs=
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
golang.org/x/crypto v0.0.0-20210817164053-32db79AC4688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b h1:1VkfZQv42XQlA/jchYumAnv1UPo6RgF9rJFkTgZIxO4=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
モジュールのインストールとバージョンアップ
go installコマンド(go install <package>@<version>)で依存モジュールをインストールすることができます。
ただし、@version付きインストールができるのは、main packageがあるモジュールのみで、非main packageはこの書式の対象ではありません。
また、go installコマンドを実行してもgo.modファイルに影響はありません。
モジュールのインストール
$ go install github.com/99designs/gqlgen@v0.13
go: downloading github.com/99designs/gqlgen v0.13.0
go: downloading github.com/urfave/cli/v2 v2.1.1
go: downloading github.com/vektah/gqlparser/v2 v2.1.0
go: downloading github.com/pkg/errors v0.8.1
go: downloading gopkg.in/yaml.v2 v2.2.4
go: downloading golang.org/x/tools v0.0.0-20200114235610-7ae403b6b589
go: downloading github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047
go: downloading github.com/hashicorp/golang-lru v0.5.0
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d
go: downloading github.com/agnivade/levenshtein v1.0.3
$ gqlgen --version
v0.13.0
モジュールの最新版をインストールし、バージョンアップ
$ go install github.com/99designs/gqlgen@latest
go: downloading github.com/99designs/gqlgen v0.17.3
go: downloading github.com/urfave/cli/v2 v2.3.0
go: downloading golang.org/x/tools v0.1.9
go: downloading github.com/vektah/gqlparser/v2 v2.4.2
go: downloading github.com/agnivade/levenshtein v1.1.1
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.1
go: downloading github.com/russross/blackfriday/v2 v2.1.0
go: downloading golang.org/x/mod v0.5.1
$ gqlgen --version
v0.17.3
モジュールの低いバージョンをインストールし、バージョンダウン
$ go install github.com/99designs/gqlgen@v0.12
go: downloading github.com/99designs/gqlgen v0.12.2
go: downloading github.com/vektah/gqlparser/v2 v2.0.1
go: downloading github.com/vektah/gqlparser v1.3.1
$ gqlgen --version
v0.12.2
インストールしたバイナリの削除
$ which gqlgen
/home/username/go/bin/gqlgen
$ rm -rf /home/isamu/go/bin/gqlgen
$ which gqlgen
モジュール情報の更新
go mod tidyコマンドでインポートしていなく使用していない依存モジュールがあれば削除し、インポートしているけどインストールしていない依存モジュールはインストールしてくれます。
また、go.modファイルとgo.sumファイルも更新します。
$ go mod tidy
go: finding module for package github.com/labstack/echo/v4
go: found github.com/labstack/echo/v4 in github.com/labstack/echo/v4 v4.7.2
まとめ
この記事では、Go言語の依存モジュール管理ツールGo Modulesについてまとめました。
少しGo言語をいじってみたいと思ったら、ブラウザ上で実行できる公式チュートリアルでコードを実際に書いてみると雰囲気がつかめるかもしれません。
今後、さらにGo言語のことについて記事にしていきたいと思います。
もし「記事の内容が間違えている!」等ありましたら、Twitterまたはお問い合わせフォームからご連絡いただければと思います。
最後までご覧いただきありがとうございました。