#78387accepted
cmd/go: disallow \\`go list ...\\` in module mode
ステータス変更: likely_accept accepted
要約
AIによる要約であり、誤りを含む場合があります。
概要
モジュールモードにおいて go list ... コマンドを禁止し、ユーザーが期待する動作をしない危険なパターンを明示的なエラーとして扱うようにする提案です。
ステータス変更
likely_accept → accepted
2026年5月27日のProposal Review Meeting(@adonovan、@bradfitz、@cherrymui、@griesemer、@ianlancetaylor、@neild、@rolandshoemaker 参加)にて、前回から合意に変化がないとして正式に承認されました。承認の理由として、提案のまとめには「go list ... がモジュールモードで何を意味するのか誰も説明できない」と記されており、仕様が根本的に未定義であることが決定打となりました。Go Commandワーキンググループ(@golang/go-command)も全員一致でこの提案を支持していました。
技術的背景
現状の問題点
モジュールモード(go.mod が存在する環境)で go list ... を実行すると、ビルドリスト内の全モジュールに含まれる全パッケージを列挙しようとします。この動作には以下の問題があります。
- ビルドに不要な依存モジュールの依存関係まで解決しようとする
- デフォルトの
-mod=modモードでは、ワークモジュールの要件ではない依存関係が含まれるため、混乱を招くエラーが発生する go list ...の戻り値はGoのバージョンによって大きく変動する(例:関連Issue #37227 によれば、go1.11では501件、go1.14では634件と増加し続けた)- 何が列挙されるのか仕様が定義されておらず、コアチームですら正確な説明ができない
# 問題のある使用例:モジュールモードで実行しても期待通りに動かない
$ go list ...
# ビルドリスト全体を解決しようとし、エラーや予期しない結果が返る
# 関連して:go list -m ... はモジュール列挙であり、この提案の対象外(引き続き動作する)
$ go list -m ... # これは問題なく動作する(モジュール一覧の列挙)
提案された解決策
go list ... をモジュールモードで実行した場合、明確なエラーメッセージを返すように変更します。エラーメッセージにはユーザーが実際に意図していると思われる代替コマンドを提示します。
重要な設計上の区別:
go list ...→ エラー(禁止)go list ./...→ 引き続き動作(カレントモジュール配下のパッケージを列挙)go list work→ 引き続き動作(ワークスペース内の全パッケージを列挙)go list -m ...→ 引き続き動作(モジュール一覧の列挙であり、別の問題はない)go list foo/...→ 引き続き動作(...が他の要素と組み合わされており、検索範囲が限定される)
これによって何ができるようになるか
この変更は新機能の追加ではなく、誤用の防止と明確なエラーガイダンスの提供です。
コード例
# Before: 予期しない動作(エラーか意味不明な結果)
$ go list ...
# 依存モジュールの解決失敗エラー、またはビルドリスト全体の列挙
# After: 明確なエラーメッセージと適切な代替案の提示
$ go list ...
# エラー: モジュールモードでは '...' パターン単独は使用できません。
# カレントモジュールのパッケージを列挙するには './...' を、
# ワークスペース全体には 'work' を使用してください。
# 正しい使い方
$ go list ./... # カレントモジュール内の全パッケージを列挙
$ go list work # go.work ワークスペース内の全パッケージを列挙
$ go list -m ... # 依存モジュール一覧を列挙(これは今後も有効)
議論のハイライト
- 後方互換性への影響は限定的: @seankhliao がGitHub上の約6,700件の非フォーク・非アーカイブリポジトリでの使用例を調査した結果、スポットチェックした上位5件はドキュメントやログメッセージ内の記述であり、実際のコードでの使用ではなかった。そもそも
go test ...等でも同様に機能しないため、実害は少ないと判断された。 go list -m ...は対象外: パッケージではなくモジュールを列挙する-mフラグとの組み合わせは、問題のある動作をしないため、引き続き許可される。...の再利用について: 「Dockerビルドキャッシュの最適化のために...をビルド可能パッケージの列挙として再利用できないか」という議論があったが、@matloob は「ビルド可能パッケージの定義がallより広く、列挙が難しい」として否定的な見解を示した。- Go Commandワーキンググループの全員一致支持:
@golang/go-commandグループの全メンバーが、この変更をProposal Committeeに推薦することを支持した。 ...の動作が長年未定義: 関連Issue #37227(2020年オープン)でもモジュールモードにおける...の動作がドキュメント化されていないことが指摘されており、この問題は長年放置されていた。