Go Modulesの「go: module not found」エラーを修正する

beginner🔷 Go2026-03-21| Go 1.16以降、任意のOS(Linux、macOS、Windows)、Go Modules(go.mod)を使用するプロジェクト

Error Message

go: module not found
#go#モジュール#go.mod#依存関係

エラーの内容

go buildgo run、または go get を実行すると、以下のエラーが発生します:

go: module not found

より詳細なコンテキストが表示される場合もあります:

go: github.com/some/package@v1.2.3: reading https://proxy.golang.org/github.com/some/package/@v/v1.2.3.info: 404 Not Found
go: module not found

Go がモジュールを見つけられない状態です — ローカルキャッシュにも、プロキシにも存在しないか、go.mod の設定が間違っています。原因は主に7つのいずれかです。

原因

原因はさまざまで、意外と多岐にわたります:

  • プロジェクトルートに go.mod が存在しない、またはモジュールディレクトリの外で Go コマンドを実行している
  • go.mod のモジュールパスが、コードで実際にインポートしているパスと一致していない
  • 指定したパッケージバージョンが存在しない — タグがプッシュされていないか、削除されている
  • GO111MODULE=off が設定されているため、Go が go.mod を完全に無視して GOPATH モードにフォールバックしている
  • 公開プロキシ proxy.golang.org からアクセスできないプライベートモジュール
  • 存在しないローカルパスを指している replace ディレクティブ
  • 破損または不完全なモジュールキャッシュ

解決方法

1. Go モジュール内にいることを確認する

プロジェクトルートに go.mod が存在するか確認します:

ls go.mod

ファイルがない場合は初期化します:

go mod init github.com/yourname/yourproject

次に、必要な依存関係をすべて取得します:

go mod tidy

2. モジュールパスがインポートと一致しているか確認する

go.mod を開いて最初の行を確認します:

module github.com/yourname/yourproject

go 1.21

よくある落とし穴:コードが github.com/yourname/yourproject/utils をインポートしているのに、go.mod でモジュールが myapp と宣言されている場合があります。Go は2つの異なるモジュールパスと見なして失敗します。インポート文で使用しているパスと完全に一致するよう module 行を修正してください。

3. GO111MODULE を確認する

モジュールモードは Go 1.16 以降デフォルトになっています。ただし、古い CI マシンなどで誰かが環境変数に GO111MODULE=off を設定していると、Go は go.mod を黙って無視します。

go env GO111MODULE

off になっている場合は修正します:

# Linux/macOS
export GO111MODULE=on

# Windows (PowerShell)
$env:GO111MODULE = "on"

またはデフォルトに戻すためにクリアします:

go env -w GO111MODULE=

4. 不足しているモジュールを直接取得する

特定のパッケージが見つからない場合は、明示的に追加します:

go get github.com/some/package@latest

特定のリリースに固定する場合:

go get github.com/some/package@v1.2.3

go.modgo.sum の整合性を保つため、必ず後で go mod tidy を実行してください:

go mod tidy

5. 壊れた replace ディレクティブを確認する

存在しないローカルパスを指している go.modreplace ブロックは、毎回このエラーを引き起こします:

replace github.com/some/package => ../local-fork

ls ../local-fork を実行してディレクトリが存在するか確認します。パスが変わっている場合は更新し、オーバーライドが不要になった場合はディレクティブを削除してください。

6. プライベートモジュールに対応する

公開プロキシはプライベートリポジトリ — GitHub Enterprise、GitLab セルフホスト、Gitea など — にアクセスできません。プライベートドメインにはプロキシをスキップするよう Go に指示します:

go env -w GOPRIVATE=gitlab.company.com/*
go env -w GONOSUMCHECK=gitlab.company.com/*

これにより、Go はそれらのモジュールを proxy.golang.org 経由ではなく、ソースから直接取得します。認証には SSH キーまたは ~/.netrc エントリも必要です。

7. モジュールキャッシュを消去する

ダウンロードの途中でキャッシュが破損し、以降の取得がブロックされることがあります。キャッシュをクリアします:

go clean -modcache
go mod download

大きなプロジェクトでは数百メガバイトの再ダウンロードが発生する場合がありますが、キャッシュの問題を切り分ける最も確実な方法です。

修正の確認

すべてのモジュールが正常に解決されることを確認します:

go mod verify

期待される出力:

all modules verified

次にフルビルドを実行します:

go build ./...

クリーンな出力が得られれば完了です。特定の依存関係がどこから来ているか確認するには:

go mod graph | grep some/package

クイック診断チェックリスト

  • go.mod がない?go mod init を実行する
  • モジュールパスが一致しない? → go.mod の module 行を修正する
  • GO111MODULE=off になっている? → 解除するか on に設定する
  • バージョンが存在しない? → リポジトリのタグを確認し、@latest を使用する
  • プライベートリポジトリ? → ドメインに GOPRIVATE を設定する
  • replace ディレクティブが壊れている? → パスを確認するかディレクティブを削除する
  • キャッシュが古い?go clean -modcache を実行する

リポジトリをクローンしたばかりの場合

プロジェクトをクローンしてすぐにこのエラーが発生した場合は、ビルドの前に go mod download を実行してください。go.sum に記載されているすべての依存関係をローカルキャッシュに取得します — Go における npm install に相当する操作です。

git clone https://github.com/example/repo
cd repo
go mod download
go build ./...

クローン直後の「module not found」エラーのほとんどは、このひとつの手順で解消されます。

Related Error Notes