Go 1.16
から、go get
とgo install
の役割が明確に分かれました。今回は、Go 1.16
からこれらのコマンドがどのように変わったかを紹介します。
大雑把に分けると、go get
はgo.mod
を編集するためのコマンドに、go install
はバイナリのビルド、インストールのためのコマンドにと、役割が分かれました。
次からは、それぞれのコマンドについて、もっと詳しく見ていきます。
go get
はgo.mod
の編集と依存関係の解決を行います。
$ 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
はバイナリのインストールを行います。下記のように、パッケージ名とバージョンの指定が必須です(最新版をインストールする場合はlatest
でも可)
go install
すると$GOPATH/bin/
にダウンロードされます。
$ 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
を実行する実際のコマンドは下記のようになります。
$ cd $(mktemp -d); GO111MODULE=on go get golang.org/x/crypto
これを毎回実行する必要がありました。それに比べると、go install
コマンド一発で済むようになったのはありがたいですね。
go:generate
で外部パッケージを直接実行するには、以下のように記述する必要があります。
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
からは、外部パッケージを直接実行できるようになったので、以下のように書くことができます。
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 1.16
では、go build
やgo test
を実行した際に、自動でgo.mod
が変更されなくなりました。import文を変更した場合はgo mod tidy
を実行しておきましょう。
今回は、Go 1.16
からgo get
とgo install
がどのように変わったかを紹介しました。