GOROOTエラー: Goモジュールでのパッケージ解決問題
問題の概要
Goプロジェクトのビルド時に「package XXX is not in GOROOT」というエラーが発生する場合、これはGoのモジュールシステムとパッケージ解決に関する設定の問題です。このエラーは、Goコンパイラが依存パッケージをGOROOT(Goの標準ライブラリが配置されているディレクトリ)内で探しており、自作パッケージがそこに存在しないために発生します。
start.go: package project/game is not in GOROOT (C:\Go\src\project\game)
根本原因
この問題の主な原因は以下のいずれかです:
- モジュール設定の不備: 複数の
go.mod
ファイルが存在する、またはモジュール名が正しく設定されていない - インポートパスの誤り: 自作パッケージのインポートパスがモジュール名と一致していない
- 環境変数の設定:
GO111MODULE
環境変数やGOPATH
の設定が適切でない - Goのバージョン: 使用しているGoのバージョンが対象パッケージをサポートしていない
- ビルドコマンドの誤り: 不正なビルドコマンドの使用
解決策
1. モジュール設定の確認と修正
プロジェクトルートに単一のgo.mod
ファイルがあることを確認し、不要なgo.mod
ファイルを削除します。
# プロジェクトルートに移動
cd /path/to/project
# 余分なgo.modファイルを削除
find . -name "go.mod" -not -path "./go.mod" -delete
# 必要に応じてモジュールを再初期化
go mod init <モジュール名>
WARNING
複数のgo.mod
ファイルを作成すると、Goがモジュール間の依存関係を正しく解決できなくなるため、1リポジトリ1モジュールが基本原則です。
2. インポートパスの修正
モジュール名とインポートパスを一致させる必要があります。go.mod
ファイルで定義されたモジュール名を基準に相対パスでインポートします。
// go.mod
module github.com/username/project
// main.go
import (
"github.com/username/project/game"
"github.com/username/project/game/entity"
)
3. 環境変数の設定
Goモジュールを有効にするための環境変数を設定します。
# Go 1.16以降ではデフォルトでonですが、明示的に設定することも可能
go env -w GO111MODULE=on
# GOPATHの確認(モジュールモードではあまり意識する必要はありません)
echo $GOPATH
INFO
Go 1.16以降ではGO111MODULE=on
がデフォルトとなっています。古いバージョンを使用している場合のみ明示的な設定が必要です。
4. 正しいビルドコマンドの使用
プロジェクトの構造に合わせた正しいビルドコマンドを使用します。
# プロジェクトルートから実行
go build ./...
# 特定のパッケージをビルド
go build ./server
# メインパッケージを実行
go run main.go
# または
go run ./server
DANGER
go run build
やgo run package名
(パス指定なし)は誤ったコマンドです。正しい形式で実行しましょう。
5. Goのバージョン確認
使用しているパッケージが現在のGoバージョンでサポートされているか確認します。
# Goのバージョン確認
go version
# 標準パッケージの存在確認(例: net/netip)
ls $GOROOT/src/net/netip 2>/dev/null || echo "パッケージが存在しません"
プロジェクト構造のベストプラクティス
適切なGoプロジェクトの構造例:
project/
├── go.mod # モジュール定義(ルートに1つのみ)
├── main.go # エントリポイント
├── internal/ # 内部パッケージ(外部からインポート不可)
│ └── utils/
│ └── helper.go
├── pkg/ # 公開可能なライブラリコード
│ └── math/
│ └── calc.go
└── cmd/ # 複数の実行可能ファイル
├── app1/
│ └── main.go
└── app2/
└── main.go
トラブルシューティングチェックリスト
- [ ] プロジェクトルートに単一の
go.mod
ファイルがあるか - [ ] インポート文のパスがモジュール名と一致しているか
- [ ]
GO111MODULE
が適切に設定されているか(最新版ならデフォルトでOK) - [ ] 使用しているGoのバージョンがパッケージをサポートしているか
- [ ] 正しいビルドコマンドを使用しているか
- [ ] パッケージ名のスペルが正しいか
- [ ] エクスポートしたい識別子が大文字で始まっているか
まとめ
「package XXX is not in GOROOT」エラーは、Goのモジュールシステムが正しく設定されていない場合に発生します。現代のGo開発では、適切なモジュール管理と import パスの設定が不可欠です。上記の解決策を順に試すことで、ほとんどの場合の問題を解決できるでしょう。
Goのモジュールシステムについてさらに学びたい場合は、公式ドキュメントのGo Modules Referenceを参照することをお勧めします。