LoginSignup
23
11

More than 3 years have passed since last update.

Go1.14で来るGo Modules関連の変更を見てみる

Posted at

この記事は Go3 Advent Calendar 2019 の21日目です。

本日(12/21)時点でのGoの最新バージョンは1.13.5ですが、次バージョンであるGo1.14が2020年2月頃にリリース予定です。

ここ数バージョンで急激に発展してきたGo Modules周りにもいくつか変更が入る予定です。

そこでGo1.14ではどのような変更が入るか簡単に追ってみたいと思います。

Vendoringまわりの変更

vendorディレクトリが存在する場合の-modフラグの挙動

Go1.13時点ではgo mod vendorを行うとプロジェクト配下にvendorディレクトリが作成され、そこに全ての必要なパッケージが配置されます。

Go1.14ではvendorディレクトリが存在し、go.modファイルによるGoのバージョン指定がgo1.14以上である場合、goコマンドがデフォルトで-mod=vendorフラグを受け入れます。

-mod=modの追加

新たに-mod=modフラグが追加され、-mod=modを指定する場合は従来のモジュールキャッシュからモジュールをロードするようになります。

また-mod=vendorが指定されている場合は、goコマンドはvendor/modules.txtファイルとgo.modに一貫性があるか検証を行います。

go list -mの暗黙的な挙動変更

今までgo list -mはvendorディレクトリに存在しない暗黙的な依存関係を省略していましたが、それがなくなります。-mod=vendorが指定されている場合は明示的に失敗となります。

vendor周りはデプロイ時やコンテナイメージ作成でパッケージを配置する際によく使われることがあると思いますが、挙動の変化に注意したいですね。

go getの変更

go getコマンドで-modフラグを受け入れなくなります。
Go1.13までは-modフラグが付与されている場合は無視されるか失敗となっていたので、明示的に付与しないようにする必要があります。

フラグまわりの変更

-mod=readonlyのデフォルト適用追加

今までもCIやTest用途でgo.modに変更が必要ないことを確認するために役立つ-mod=readonlyフラグですが、go.modファイルが読み取り専用かつvendorディレクトリが存在しない場合、-mod=readonlyがデフォルトで設定されるようになります。

-modcacherwフラグの追加

これは-mod=readonlyのように変更がある場合は失敗させるのではなく、モジュールキャッシュに新しく作成したディレクトリを残すように支持するフラグです。これによってCIやテストによって検証されていないファイルを誤って追加されてしまう可能性が高まりますが、go clean -modcacheではなくrm -rfで明示的にモジュールキャッシュを消すことが可能です。

つまり全てのモジュールキャッシュを削除するのではなく、新たに追加された部分だけを明示的にrmコマンドで消せるようにするフラグだと思っています。

-modfile=fileフラグの追加

-modfile=fileはトップディレクトリにあるgo.modではなく、明示的に読み込みたいgo.modファイル(modfile)を読み取るフラグです。
本来modfileは暗黙的に読み込まれますが、このフラグを使うと指定したmodfileを読み込むようになります。
またmodfileを指定した場合、それに対応するgo.sumファイルも参照します。それはmodfileから.mod拡張子を削除し、.sumをつけて参照されます。

モジュールの非互換バージョンの挙動変更

go.modファイルに最新バージョンのモジュールが含まれている場合、go getを行っても明示的にバージョンが指定されている場合を除いて、互換性のないメジャーバージョンにはアップデートをしなくなります。

go.modファイルのメンテナンス

go mod tidy以外のgoコマンドは、変更が表面的なものである場合go.modファイルを編集しなくなりました。明示的にメンテナンスするにはgo mod tidyする必要があります。

そして-mod=readonlyを設定した場合、goディレクティブの欠如や誤ったindirectコメントが原因でgoコマンドが失敗しないようになります。

その他

goコマンドはモジュールモードでSubversionをサポートするようになります。

またgoコマンドはProxyや他のHTTPサーバからのプレーンテキストなエラーメッセージのスニペットを含むようになります。
エラーメッセージはUTF-8で、グラフィック文字(?)とスペースのみで構成されている場合に表示されます。

終わりに

Go1.14も更にモジュール管理がカッチリしたものになりそうな片鱗が見て取れますね。
またリリース後に検証して行きたいと思います。

23
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
11