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

Go Proposal Weekly Digest

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

#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)、今回はより広範囲な変更ながらも先例があります。

関連リンク