技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

Modules【Go】

Goのversion 1.12以降では、$GOPATH/src以下のパッケージ管理を改め、go.modによって依存関係を管理できるようになりました。

まずは、Goのversionを確認し、必要に応じて最新化します。

$ go version
$ brew upgrade go


Modulesを試すには、下記コマンドにより環境変数を設定します。

$ export GO111MODULE=on


VS Codeでは、起動時に環境変数を読み込むので、開いている途中でgo modを導入した場合には、再起動しないと、エディタ上のエラーが表示され続けるので注意します。

なお、1.13ではデフォルトで有効になるそうです。

この環境変数の設定は、bashファイルなどに設定して自動実行させない限り、毎回シェルの起動時に手動で打ち込む必要があるので、下記コマンドを実行し、自動的に実行させるのがオススメです。

// ログイン時に実行されるファイル
$ nano ~/.bash_profile
// シェル起動時に実行されるファイル
$ nano ~/.bashrc


go.modは下記コマンドにより作成します。

$ go mod init
// init の後に任意のディレクトリを指定できる
// go modコマンドは、go help modで確認できる


これによって、dep コマンドは実行不要になり、importに記載された依存関係がgo buildやgo test時に自動的に解決されます。

明示的に依存関係の解決を行いたい時は、下記コマンドを実行します。
ローカルにキャッシュされるため、エディタ上のエラーを消し去りたい時に使えます。

$ go mod download



また、不必要な依存関係を削除したい場合には、下記コマンドを実行します。

$ go mod tidy

会社などで運用しているリポジトリを持ち、商用環境がある場合には、商用環境用のDockerfileを利用してgo mod tidyを実行すべきです。なぜなら、上記コマンドの場合、ローカル環境での依存関係を考慮した結果となるからです。

プロジェクトのディレクトリで、下記コマンドを実行し、go mod tidyを1度するためだけのコンテナを起動します。

$ docker-compose run --rm --no-deps api go mod tidy


上記は一度だけコマンドを実行するrunを使って、起動が終わったら削除するrmオプションを指定、さらにdocker-compose.yamlで、linksまたはdepends_onに指定されたサービスは起動しないno depsオプションを利用しています。指定サービスであるapiにて、コマンドgo mod tidyを実行します。apiは、docker-compose.yamlに記載されているserviceの1つです。