Go言語でパッケージを扱う際に使用するgo installとgo getは、それぞれ異なる目的を持っている。この2つのコマンドの違いを理解することで、適切なパッケージ管理ができるようになる。
go getはプロジェクトの依存関係を管理するためのコマンドである。このコマンドを実行すると、指定したパッケージがプロジェクトのgo.modファイルに依存関係として追加され、パッケージ自体はモジュールキャッシュ(通常は$GOPATH/pkg/mod)にダウンロードされる。重要なのは、このコマンドはバイナリファイルを生成しないということである。
一方、go installは実行可能なバイナリファイルを生成してインストールするためのコマンドである。インストールされたバイナリは$GOPATH/bin(または$GOBIN)に配置され、システム全体で実行可能になる。このコマンドは現在のプロジェクトのgo.modファイルを変更しない。
具体的な使用例
go getの使用例
プロジェクトでWebフレームワークのGinを使いたい場合、以下のようにコマンドを実行する。
go get github.com/gin-gonic/gin
このコマンドを実行すると、go.modファイルに以下のような行が追加される。
require github.com/gin-gonic/gin v1.9.1
同様に、テストライブラリのtestifyを追加したい場合は次のようになる。
go get github.com/stretchr/testify
これらのパッケージは、Goのソースコード内でimport文を使って利用できるようになる。
go installの使用例
コードの品質チェックツールであるgolangci-lintをシステム全体で使えるようにインストールしたい場合、以下のコマンドを実行する。
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
このコマンドを実行すると、golangci-lintコマンドがシステムのどこからでも実行可能になる。同様に、開発時のホットリロードツールであるairをインストールする場合は次のようになる。
go install github.com/air-verse/air@latest
これらのツールは、ターミナルから直接コマンドとして実行できるようになる。
プロジェクトレベルとグローバルレベルの使い分け
この2つのコマンドの使い分けは、「プロジェクトレベル」と「グローバルレベル」という観点で理解すると分かりやすい。
プロジェクトレベルで必要なものはgo getを使用する。これには、Webフレームワーク(gin、echo)、テストライブラリ(testify)、データベースドライバー(pq、mysql)、設定管理ライブラリ(viper)などが含まれる。これらは特定のプロジェクトでのみ必要であり、プロジェクトのgo.modファイルで管理される。
グローバルレベルで必要なものはgo installを使用する。これには、コードの品質チェックツール(golangci-lint)、開発用のホットリロードツール(air)、モックコード生成ツール(mockgen)、プロトコルバッファーのコンパイラー(protoc-gen-go)などが含まれる。これらは開発環境全体で使用するツールであり、特定のプロジェクトに依存しない。
他言語との比較
この使い分けは、他のプログラミング言語の経験がある場合により理解しやすくなる。
Rubyのgem installコマンドは、go installと非常に似た概念である。gem install railsを実行すると、システム全体でrailsコマンドが使えるようになるのと同様に、go installもシステム全体で実行可能なコマンドを提供する。
ただし、Rubyではライブラリもツールも基本的にgem installで統一されているのに対し、Goではライブラリはgo get、ツールはgo installと明確に使い分けられている点が異なる。
バージョン管理
両方のコマンドでバージョンを指定することができる。go getでは以下のようにバージョンを指定できる。
go get github.com/gin-gonic/[email protected]
go installでも同様にバージョンを指定できる。
go install github.com/golangci/golangci-lint/cmd/[email protected]
最新版を使いたい場合は、@latestを指定する。
PATHの設定
go installでツールをインストールした後、コマンドが見つからない場合がある。これは、インストールされたバイナリの場所がシステムのPATHに含まれていないためである。
まず、Goの環境設定を確認する。
go env GOPATH
go env GOBIN
go installでインストールされたバイナリは、$GOBINが設定されている場合は$GOBINに、未設定の場合は$GOPATH/binに配置される。多くの場合、デフォルトでは~/go/bin($HOME/go/bin)にインストールされる。
バイナリが実際にインストールされているかを確認するには、以下のコマンドを実行する。
ls $(go env GOPATH)/bin
コマンドが見つからない場合は、PATHに追加する必要がある。使用しているシェルの設定ファイル(.bashrcや.zshrc)に以下の行を追加する。
echo 'export PATH=$(go env GOPATH)/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
zshを使用している場合は、.bashrcを.zshrcに置き換える。この設定により、今後go installでインストールするすべてのツールが自動的にコマンドとして使用できるようになる。
注意点
Go 1.17以降では、go getでバイナリをインストールする機能は非推奨となっている。以前はgo getでもツールのインストールが可能だったが、現在ではgo installの使用が強く推奨されている。
この変更により、パッケージ管理の責任がより明確に分離され、プロジェクトの依存関係管理とツールのインストールが区別されるようになった。