メインコンテンツへスキップ

Go Proposal Weekly Digest

Go言語のproposal更新を毎週お届け

#78387accepted

cmd/go: disallow \\`go list ...\\` in module mode

ステータス変更: likely_accept accepted

要約

AIによる要約であり、誤りを含む場合があります。

概要

モジュールモードにおいて go list ... コマンドを禁止し、ユーザーが期待する動作をしない危険なパターンを明示的なエラーとして扱うようにする提案です。

ステータス変更

likely_acceptaccepted
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年オープン)でもモジュールモードにおける ... の動作がドキュメント化されていないことが指摘されており、この問題は長年放置されていた。

関連リンク