#78350active
cmd/go: change GO111MODULE=auto to have GO111MODULE=on behavior
新規提案
要約
AIによる要約であり、誤りを含む場合があります。
概要
GO111MODULE=auto の挙動を GO111MODULE=on と同一にすることで、go コマンドが起動時に動作モードを確定できるようにし、内部実装を簡素化するためのプロポーザルです。
ステータス変更
(新規) → active
2026年4月16日のProposal Review Meeting(@aclements、@griesemer、@ianlancetaylor 他)において、active カラムへの追加が決定され、週次レビューの対象となりました。今後、議論の経過を経てaccept/declineが判断されます。
技術的背景
現状の問題点
GO111MODULE 環境変数には現在3つの値があります。
on: 常にモジュールモードで動作off: 常にGOPATHモードで動作auto(デフォルト): カレントディレクトリにgo.modがあればモジュールモード、なければGOPATHモードで動作
このautoの挙動により、goコマンドは起動時に動作モードを確定できず、実行ディレクトリを調べてgo.modの有無を確認する処理が必要でした。具体的には、ツールチェーン選択コードが「モジュール内かワークスペース内か」を都度確認する必要があり、コードの複雑化につながっていました。
提案された解決策
GO111MODULE=auto の挙動を GO111MODULE=on と同一にします。つまり auto を設定(または未設定)の状態で、go.mod が存在しないディレクトリで作業していても、常にモジュールモードとして動作します。GOPATHモードを使いたい場合は明示的に GO111MODULE=off を設定する必要があります。
なお、GOPATHモード自体は #60915 の決定により無期限に保持されるため、GO111MODULE=off は引き続き機能します。
これによって何ができるようになるか
この変更の主な恩恵は開発者体験よりもツールチェーン内部の簡素化にあります。
goコマンドが起動時に動作モードを確定できるため、ツールチェーン選択ロジックを簡略化できる- モジュール/ワークスペース判定のための実行時チェックが不要になる
- Goツールチェーン全体でのコードクリーンアップが可能になる
コード例
# Before: go.modがないGOPATHプロジェクトのディレクトリで作業する場合
# GO111MODULE=auto (デフォルト) ではGOPATHモードが自動選択される
cd ~/go/src/oldproject
go build ./... # GOPATHモードで動作
# After: 同じ状況でGO111MODULE=autoはGO111MODULE=onと同じ挙動
cd ~/go/src/oldproject
go build ./... # モジュールモードで動作 → go.modが必要になる
# GOPATHモードを使い続けたい場合は明示的に指定が必要
GO111MODULE=off go build ./...
議論のハイライト
- Go Command Working Groupの全会一致支持: @matloob を通じて、Go Command Working Group(@golang/go-command)が全会一致でこのプロポーザルを支持し、proposal committeeへの推進を表明しました。
- 現在も
autoを活用しているユーザーが存在: @rittneje は、古いGOPATHプロジェクトと新しいモジュールプロジェクトを行き来する開発者がautoをグローバルに設定して自動切り替えに頼っている実態を報告。この変更により、環境変数の手動切り替えが必要になるという懸念が示されました。 - GOPATHモードからの移行が困難なケース: インポートパスの大規模変更、git submodulesを使った依存管理、アクティブ開発中のマイグレーションなど、移行が優先度付けされにくい現実的な障壁が共有されました。
- 代替案の検討: @matloob は、
go.modの有無に応じてGO111MODULEを自動切り替えするラッパーツールの提供を代替策として言及。@rittneje は$GOPATH/go.envのようなディレクトリスコープの設定ファイルの可能性を提案しました。 - 過去の前例:
autoの挙動は Go 1.13 でも変更されており($GOPATH/src内でもGOPATHモードに自動入らなくなった、#31857)、今回はより広範囲な変更ながらも先例があります。