カテゴリー: BackEnd

Go 1.16でのgo getとgo installの変更点

はじめに

Go 1.16から、go getgo installの役割が明確に分かれました。今回は、Go 1.16からこれらのコマンドがどのように変わったかを紹介します。

go getとgo installの役割

大雑把に分けると、go getgo.modを編集するためのコマンドに、go installはバイナリのビルド、インストールのためのコマンドにと、役割が分かれました。

次からは、それぞれのコマンドについて、もっと詳しく見ていきます。

go getの役割

go getgo.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の役割

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を変更せずにツールだけインストールするには以下の手順が必要でした。

  1. go.modのあるディレクトリから抜ける
  2. ツール側のgo.modを有効化する
  3. go getを実行する

実際のコマンドは下記のようになります。

$ cd $(mktemp -d); GO111MODULE=on go get golang.org/x/crypto

これを毎回実行する必要がありました。それに比べると、go installコマンド一発で済むようになったのはありがたいですね。

go:generateと併用する

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.mod関連の変更点

Go 1.16では、go buildgo testを実行した際に、自動でgo.modが変更されなくなりました。import文を変更した場合はgo mod tidyを実行しておきましょう。

さいごに

今回は、Go 1.16からgo getgo installがどのように変わったかを紹介しました。

おすすめ書籍

Hiroki Ono

シェア
執筆者:
Hiroki Ono
タグ: golang

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前