はじめに
Go 1.16
から、
go get
と
go install
の役割が明確に分かれました。今回は、
Go 1.16
からこれらのコマンドがどのように変わったかを紹介します。
go getとgo installの役割
大雑把に分けると、
go get
は
go.mod
を編集するためのコマンドに、
go install
はバイナリのビルド、インストールのためのコマンドにと、役割が分かれました。
次からは、それぞれのコマンドについて、もっと詳しく見ていきます。
go getの役割
go get
は
go.mod
の編集と依存関係の解決を行います。
1 2 3 4 5 6 7 8 9 10 11 | $ go mod init github.com/test/goinit $ go get golang.org/x/crypto go: downloading golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 go get: added golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 $ cat go.mod module github.com/test/goinit go 1.16 require golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect |
ちなみに、
Go 1.16
の段階では、まだバイナリのインストールまで行われます(1.17ではインストール時に警告がでるようになり、1.18ではインストール機能が削除される予定です)
なお、コードにimport文を書いてから
go mod tidy
を実行するれば、不要なモジュールの削除と新規のモジュールの追加が行われるので、
go get
は使わなくても良いかもしれません。
go installの役割
go install
はバイナリのインストールを行います。下記のように、パッケージ名とバージョンの指定が必須です(最新版をインストールする場合は
latest
でも可)
go install
すると
$GOPATH/bin/
にダウンロードされます。
1 2 3 4 5 6 | $ go install golang.org/x/crypto@latest go install golang.org/x/crypto@latest: module golang.org/x/crypto@latest found (v0.0.0-20210921155107-089bfa567519), but does not contain package golang.org/x/crypto $ cat go.mod module github.com/test/goinit go 1.16 |
このように、
go install
では
go.mod
の変更が行われません。
この変更で何が改善されたのか
この変更で具体的に何が改善されたのかというと、変更以前はグローバルにツールをインストールするには、
go get
コマンドが使用されていましたが、上でも書いたとおり、
go get
コマンドは
go.mod
の編集も兼ねているため、不用意な
go.mod
の更新が行われる可能性がありました。
go.mod
を変更せずにツールだけインストールするには以下の手順が必要でした。
-
go.mod
のあるディレクトリから抜ける - ツール側の
go.mod
を有効化する -
go get
を実行する
実際のコマンドは下記のようになります。
1 | $ cd $(mktemp -d); GO111MODULE=on go get golang.org/x/crypto |
これを毎回実行する必要がありました。それに比べると、
go install
コマンド一発で済むようになったのはありがたいですね。
go:generateと併用する
go:generate
で外部パッケージを直接実行するには、以下のように記述する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package generate //go:generate go install golang.org/x/tools/cmd/stringer@latest //go:generate stringer -type=Color type Color int const ( Red = iota Green Blue Cyan Magenta Yellow ) |
さらに、
Go 1.17
からは、外部パッケージを直接実行できるようになったので、以下のように書くことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | package generate //go:generate go run golang.org/x/tools/cmd/stringer@latest -type=Pill type Color int const ( Red = iota Green Blue Cyan Magenta Yellow ) |
その他のgo.mod関連の変更点
Go 1.16
では、
go build
や
go test
を実行した際に、自動で
go.mod
が変更されなくなりました。import文を変更した場合は
go mod tidy
を実行しておきましょう。
さいごに
今回は、
Go 1.16
から
go get
と
go install
がどのように変わったかを紹介しました。