フューチャー技術ブログ

Go1.17における go get の変更点

The Gopher character is based on the Go mascot designed by Renee French.

TIGの辻です。

Go 1.17連載の5日目の記事です。本記事ではGo1.17の go get に関するアップデートの詳細をお伝えします。

go get に関する変更点サマリ

  • モジュール外からの go get におけるコマンドインストール時に、警告を出力する
  • go get-insecure フラグは使えなくなった、代わりに環境変数 GOINSECURE を使う

モジュール外からの go get におけるコマンドインストール時に、警告を出力する

go get 時の警告

Go1.16のリリースノートでも、コマンドのインストールで go get を使うのは非推奨、とお知らせがありましたが、Go1.17では、モジュール外からコマンドのバイナリを go get を使ってインストール1した場合、警告が出るようになりました。いよいよ次のGo 1.18のリリースでは go get でコマンドのインストールができなくなりそうです。

  • 非推奨なインストール方法

メインモジュール外で go get してコマンドをインストールしようとすると、以下のように警告が出力されます。将来的には go get 時にデフォルトで -d フラグが有効になるため、go get でバイナリをインストールすること自体ができなくなります。

$ go get github.com/future-architect/awsmfa/cmd/awsmfa
go: downloading github.com/future-architect/awsmfa v1.1.1
go: downloading gopkg.in/ini.v1 v1.62.0
go get: installing executables with 'go get' in module mode is deprecated.
Use 'go install pkg@version' instead.
For more information, see https://golang.org/doc/go-get-install-deprecation
or run 'go help get' or 'go help install'.
  • 推奨されるインストール方法

コマンドのインストールは以下のように go install を使いましょう。Go1.16の連載の Go 1.16のgo installについて の記事の中でも紹介していますが、Go1.16からツールなどの実行バイナリをローカル環境にインストールする場合に go install でバージョンを指定してインストールできます。

go install github.com/future-architect/awsmfa/cmd/awsmfa@v1.1.1

将来的にデフォルトで go get 時に -d オプションが有効になることの影響

将来的には go get 時はデフォルトで -d フラグが有効になります。-d フラグはソースのみをインストールし、ビルドは行われません。go.mod ファイルを更新し、パッケージのビルドに必要なソースをダウンロードするだけです。

-d がデフォルトで有効になると、go get 時はソースのダウンロードのみを行い、ビルドはしなくなるため、以下のような影響があります。

  • 1.go get がより高速になる
  • 2.プラットフォーム依存のソースを、ローカルの環境でビルドできない場合、go get 時にエラー報告しなくなる

1つ目のポイントは多くのGopherにとって嬉しいポイントかもしれません。

なぜ非推奨になったのか

Deprecation of ‘go get’ for installing executables に背景が書いてあります。端的に言うと「go get の、コマンドをビルドしてインストールする機能が go install と重複するため」ということです。

コントリビュートチャンス?!

おまけですが、多くのREADMEなどのドキュメントではGo製のコマンドをインストールする方法として go get の手順を記載しています。golang のリポジトリにもコマンドインストールで go get を用いていた記述がいくつかありました。Goにコントリビュートしてみたい方はチャンスかもしれません。golang/review 2 などでも go get としてコマンドをインストールする手順がまだドキュメントに記載されています。もちろんFutureが公開しているGo製のツールのドキュメントも今後アップデートしていく必要があります。

go get-insecure フラグは使えなくなった、代わりに環境変数 GOINSECURE を使う

go get 時に -insecure を付与してコマンドを実行すると、-insecure フラグはサポートされなくなった旨が表示されるようになりました。Go1.16のリリースノートでは将来 -insecure フラグを削除するよ、とお知らせがありましたが、それが実現しました。

  • Go1.17で -insecure フラグを付与して go get したときの例
$ go get -insecure github.com/future-architect/go-mcprotocol
go get: -insecure flag is no longer supported; use GOINSECURE instead

Go1.14から環境変数 GOINSECURE が追加になっているので、安全でない方法でアクセスする必要があるときは環境変数 GOINSECURE に対象のホストを指定しましょう。


  1. 1.ソースをダウンロードして、ソースからビルドしたバイナリを $GOPATH/bin に配備する、ということ
  2. 2.https://github.com/golang/review/tree/2e4fd9a232c3368afeca71043fd7538ed11c681c