go installとgo getをどう使い分ければ良いのか調べた

1 min read読了の目安(約1700字

はじめに

最近、Goを使い始めたのですが、goimportsやgolintなどの開発ツールをローカルにインストールするためには、go installgo getのどちらを使えば良いか分かりませんでした。
go installgo getについて調べたことをまとめ、備忘録として残したいと思います。

Goのバージョンは1.16であることを前提に考えます。
つまり、Go Modulesを使用して開発することが前提になります。

この記事が他の人の参考になれば幸いです。
また、この記事の内容に間違った記載がありましたら、指摘していただけるとありがたいです。

環境

名前 バージョン
macOS Big Sur 11.2.1
Go 1.16

go installについて

go installは依存関係にあるパッケージも含めてコンパイルして、作成したバイナリの実行ファイルを適切な場所(デフォルトでは$GOPATH/bin$HOME/go/bin)に配置するコマンドです。
サフィックス(@latestや@v1.0.0など)をつけてバージョンを指定して、インストールすることもできます。

go installの使い方

go install [build flags] [packages]

という形式で使用します。
例えばgoimportsをインストールするには以下のようなコマンドになります。

go install golang.org/x/tools/cmd/goimports@latest

go getについて

go getは現在のモジュールに依存関係を追加して、インストールするコマンドです。
モジュール間の依存関係を解決し、go.modを更新して、ソースコードをダウンロードし、パッケージをインストールします。
go installと同じようにサフィックスをつけてバージョンを指定して、依存関係に追加できます。

go getの使い方

go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]

という形式で使用します。
依存関係から削除する場合はサフィックスを@noneとします。
-uオプションでパッケージのマイナーリリースやパッチリリースがあれば、それをインストールします。
他のオプションについてもAdd dependencies to current module and install themに載っています。

go installとgo getの使い分けについて

大きな違いは、go installgo.modを書き換えませんが、go getは書き換えるという点です。go.modは、Goにおいて依存関係などを管理するものです。

よって、現在の作成しているモジュールと依存関係のある(ソースコード内でimportする)パッケージをインストールするときはgo getを用いて、それ以外でインストールするときはgo installを用いて良いと思います。

参考