この記事は 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も更にモジュール管理がカッチリしたものになりそうな片鱗が見て取れますね。
またリリース後に検証して行きたいと思います。