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

Go Proposal Weekly Digest

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

#78387active

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

新規提案

要約

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

概要

go list ... コマンドをモジュールモードで実行した際の直感に反する挙動を禁止し、エラーを返すよう変更することを提案しています。ユーザーが期待する動作と実際の動作が大きく乖離しているため、混乱を防ぐことが目的です。

ステータス変更

(新規)active
2026年4月16日の週次プロポーザルレビュー会議(@aclements, @adonovan, @cherrymui, @griesemer, @ianlancetaylor, @neild, @rolandshoemaker)にて、議事録に追加されactiveステータスに移行しました。Go Commandワーキンググループ(@golang/go-command)が全会一致でこの提案を支持し、プロポーザル委員会へのエスカレーションを推薦したことが承認の背景にあります。

技術的背景

現状の問題点

モジュールモードにおける go list ... は、ユーザーが期待する「現在のモジュール配下のすべてのパッケージ」を列挙するのではなく、ビルドリスト内のすべてのモジュールのすべてのパッケージを列挙しようとします。これにより以下の問題が発生します。

  1. ビルドに直接必要ではない依存関係の依存関係まで解決しようとする
  2. それらのパッケージが作業モジュールの直接依存でないため、-mod=mod モードでも解決に失敗し、不可解なエラーが出る
  3. 返される結果がGoバージョンによって大きく変わり(例: go1.11で501件、go1.14で634件と増加し続ける)、再現性がない
# 問題のあるコード: モジュールモードで実行した場合
# go list ... は依存モジュール含む全パッケージを列挙しようとする
# → 意図しないパッケージが大量に含まれ、エラーになることも
$ go list ...

提案された解決策

go list ... (単独の ... ワイルドカード)をモジュールモードで実行した場合にエラーを返すよう変更します。ただし以下の場合は引き続き動作します。

  • ./...(現在のモジュール配下のパッケージ): 引き続き動作
  • work パターン: 引き続き動作
  • go list -m ...(モジュール一覧表示): 引き続き動作(パッケージ列挙とは異なる問題がないため)
  • some/path/... のようにパスコンポーネントを伴う ...: 引き続き動作(検索範囲が限定されるため)

これによって何ができるようになるか

ユーザーが誤った go list ... を実行した際に即座に意味のあるエラーメッセージを受け取れるようになります。エラーメッセージには ./...work パターンへの変更を促す提案が含まれる予定です。

コード例

# Before: 従来の書き方(モジュールモードで意図しない動作)
$ go list ...
# → 依存モジュールを含む全パッケージを列挙しようとし、エラーや予期しない大量出力が発生
# After: 正しい書き方(提案採用後はエラーで適切な代替を提示)
$ go list ...
# → エラー: "go list ...: standalone '...' pattern is not supported in module mode; use './...' or 'work'"
# 現在のモジュール配下のパッケージを列挙する場合
$ go list ./...
# go.workのワークスペース全体を列挙する場合
$ go list work

議論のハイライト

  • 既存スクリプトへの影響は限定的: @seankhliao がGitHub上の約6,700件の非フォーク・非アーカイブリポジトリを調査したところ、多くはドキュメントやログメッセージ内の記載であり、実際に go test ... などは既にこれらの環境で動作していない可能性が高い
  • go list -m ... は対象外: パッケージ列挙とモジュール列挙は異なる問題を持つため、-m フラグ付きの ... は今回の禁止対象から除外される
  • ... の再利用案: @seankhliao は ... をDockerビルドキャッシュのユースケース(go mod download 後に依存パッケージのビルドキャッシュを温める)のために再利用できないか提案したが、「ビルド可能なパッケージの定義が難しい」として@matloob は慎重な姿勢を示した
  • 長年の混乱: Issue #37227(2020年)からgo list ...の挙動がモジュールモードで文書化されていないという問題が指摘されており、今回の提案はその根本的な解決策となる
  • Go Commandワーキンググループの全会一致支持: コアチームメンバーの合意が得られており、実装への道筋が整っている

関連リンク