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

Go Proposal Weekly Digest

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

#78387likely_accept

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

ステータス変更: active likely_accept

要約

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

概要

モジュールモードにおける go list ...(裸のワイルドカード)コマンドを禁止するproposalです。このコマンドはユーザーの意図する動作をほぼ(あるいは全く)実現せず、混乱を招くため、エラーを返すよう変更することを提案しています。

ステータス変更

activelikely_accept
提案者である @matloob が所属する Go Command Working Group が全会一致でこの提案を支持し、proposalプロセスに移行されました。その後、@aclements を含むProposal Review Groupが2026年5月21日の週次ミーティングで「likely accept」と判定しました。判定理由として「go list ... が何を意味するかさえ誰も説明できない」ことが明示されています。

技術的背景

現状の問題点

モジュールモードで go list ... を実行すると、ビルドリスト内の「全モジュール」の「全パッケージ」を列挙しようとします。この動作には以下の問題があります。

  • 現在のビルドに必要でないモジュールの依存関係まで解決しようとする
  • それらの外部依存はワークモジュールの go.mod には記載されておらず、デフォルトの -mod=mod モードで混乱を招くエラーが発生する
  • 動作が文書化されておらず(Issue #37227)、ユーザーが期待する結果を返さない
    ユーザーが実際にやりたいことは多くの場合「カレントモジュール以下のパッケージを列挙する(./...)」か「ワークスペース全体のパッケージを列挙する(work)」であり、go list ... はそのいずれとも異なる動作をします。

提案された解決策

  • go list ...(裸の ... のみのパターン)はモジュールモードでエラーを返す
  • go list ./...go list example.com/... のように他のコンポーネントと組み合わせた ... は引き続き有効(検索範囲が絞られるため)
  • エラーメッセージでは ./...work の使用を代替案として案内する
  • go list -m ...(パッケージではなくモジュールを列挙するフラグ)は同問題を抱えないため、引き続き動作する

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

ユーザーが誤った go list ... を実行した際に、混乱を招く動作の代わりに明確なエラーメッセージが表示されるようになります。これによりデバッグ時間の短縮と、正しいパターンへの誘導が期待されます。

コード例

// Before: 予期しない動作・混乱を招くエラー
// モジュールモードで実行すると不完全な結果や謎のエラーが出る
$ go list ...
// → go.modに載っていない依存モジュールの解決を試みてエラーになる場合がある
// After: 明確なエラーと代替案の提示
$ go list ...
// → エラー: モジュールモードでは `go list ...` は使用できません
//   代わりに `./...`(カレントモジュール)または `work`(ワークスペース全体)を使用してください
// 正しい書き方1: カレントモジュール以下の全パッケージ
$ go list ./...
// 正しい書き方2: ワークスペース全体のパッケージ(go.work使用時)
$ go list work
// 正しい書き方3: モジュール一覧(-mフラグは引き続き有効)
$ go list -m ...

議論のハイライト

  • 後方互換性への懸念: @seankhliao が GitHub上で約6,700件の非フォーク・非アーカイブリポジトリで go (list|build|test) ... が使われていることを指摘。しかし @matloob がスポットチェックしたところ、実際のコードではなくドキュメントやログメッセージ内の記述がほとんどであり、実質的な破壊的変更は限定的と判断された。
  • go list -m ... の扱い: モジュール一覧を返す -m フラグ付きの場合はパッケージ列挙と同じ問題が起きないため、引き続き許可される方針が合意された。
  • ... の再利用の提案: ... をビルド可能なパッケージの列挙として再定義する案も出たが、「ビルド可能なパッケージ」の集合を明確に定義・列挙する方法が難しいとして採用されなかった。
  • Go Command Working Group の全会一致支持: 提案はワーキンググループ内で満場一致で支持され、Proposal Review Groupへ送付された。
  • 長年の未解決問題: Issue #37227(go list ... の動作がモジュールモードで文書化されていない)など、関連する問題が複数年にわたって蓄積されており、今回の禁止がその根本的解決となる。

関連リンク