タイトル: go: go.mod file not found in current directory or any parent directory
SEOタイトル: Go go.mod file not found の原因と対処完全ガイド
| この記事の要点 |
|
エラー内容
go: go.mod file not found in current directory or any parent directory;
see 'go help modules'
Go コマンド (go run / go build / go test / go get 等) が Go Modules モードで動作しているとき、カレントディレクトリから親方向に go.mod を探して見つからなかった場合に出ます。
背景: GOPATH モード vs Modules モード
Go 1.11 で導入された Modules は、Go 1.16 以降デフォルトです。GOPATH モードは Go 1.22 で完全廃止予定。
| 項目 | GOPATH モード (廃止) | Modules モード (現行) |
|---|---|---|
| プロジェクト場所 | $GOPATH/src/github.com/... | 任意の場所 |
| 依存管理 | $GOPATH/src に展開 | go.mod + go.sum |
| バージョン | 固定不能 | Semantic Versioning |
| GO111MODULE | off | on (デフォルト) |
対処 1: 新規プロジェクトを作る
# プロジェクトディレクトリ作成
mkdir myapp && cd myapp
# モジュール初期化
go mod init github.com/myuser/myapp
# → go.mod が生成される
cat go.mod
# module github.com/myuser/myapp
#
# go 1.22
# サンプル main.go
cat > main.go <<'GO'
package main
import "fmt"
func main() {
fmt.Println("Hello, modules!")
}
GO
go run .
# Hello, modules!
対処 2: 既存ソースに go.mod を後付け
GOPATH 時代のリポジトリを Modules 化する場合:
cd existing-project
# 初期化 (パスは GitHub URL を推奨)
go mod init github.com/myuser/existing-project
# import を解析して依存を go.mod / go.sum に書き込み
go mod tidy
# 確認
cat go.mod
cat go.sum
# ビルド
go build ./...
対処 3: モジュールパスを正しく指定
go mod init の引数はリポジトリの URL に合わせます。間違っていると後から go get で参照できません。
| シチュエーション | module path 例 |
|---|---|
| GitHub 公開 | github.com/user/repo |
| GitLab 公開 | gitlab.com/group/repo |
| 社内 Git | git.corp.example.com/team/repo |
| 主モジュール内のサブ | github.com/user/repo/v2 (Major 2 以上) |
| ローカル試作 | example.com/myapp でも可 |
対処 4: GO111MODULE 環境変数
# 現在の設定確認
go env GO111MODULE
# 強制的に Modules モード
export GO111MODULE=on
go env -w GO111MODULE=on
# 強制的に GOPATH モード (非推奨)
export GO111MODULE=off
# auto (古いデフォルト) は Go 1.16 で廃止
対処 5: プライベートモジュール (GOPRIVATE)
社内 Git や GitHub の private repo を依存にする場合、Go の Public Module Proxy (proxy.golang.org) 経由ではアクセスできず、認証エラーになります。
# プライベートリポジトリは proxy を通さない
export GOPRIVATE=git.corp.example.com,github.com/mycompany/*
go env -w GOPRIVATE=git.corp.example.com,github.com/mycompany/*
# HTTPS の代わりに SSH を使う (~/.gitconfig)
git config --global url."ssh://git@github.com/".insteadOf "https://github.com/"
# GitHub Personal Access Token を埋め込む (.netrc)
cat > ~/.netrc <
対処 6: Vendor ディレクトリで完全オフライン
CI でネットワーク不要にしたい / 依存をリポジトリに同梱したい場合:
# 依存を vendor/ に取得
go mod vendor
# ディレクトリ構造
# myapp/
# ├── go.mod
# ├── go.sum
# ├── main.go
# └── vendor/
# ├── modules.txt
# └── github.com/...
# vendor を使ってビルド
go build -mod=vendor ./...
# Go 1.14+ は vendor/ があれば自動利用
go build ./...
go.mod ファイルの構造
module github.com/myuser/myapp
go 1.22
require (
github.com/gin-gonic/gin v1.9.1
github.com/go-sql-driver/mysql v1.7.1
gorm.io/gorm v1.25.5
)
require (
// 間接依存 (indirect)
github.com/bytedance/sonic v1.9.1 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
)
// バージョン置換 (フォーク利用)
replace github.com/old/pkg => github.com/new/pkg v1.2.3
// ローカルパス置換 (開発時)
replace example.com/mylib => ../mylib
// 除外
exclude github.com/buggy/pkg v1.0.0
よく使うコマンド一覧
| コマンド | 動作 |
|---|---|
go mod init PATH | 新規モジュール作成 |
go mod tidy | 未使用削除 + 不足追加 |
go mod download | 依存を $GOPATH/pkg/mod に取得 |
go mod vendor | vendor/ に同梱 |
go mod verify | ハッシュ検証 |
go mod why pkg | なぜ依存しているか |
go mod graph | 依存グラフ |
go get pkg@v1.2.3 | バージョン指定取得 |
go get -u ./... | 全依存を最新へ |
FAQ
Q: go run main.go がエラーになる
A: カレントディレクトリに go.mod が必要です。go mod init を先に実行してください。
Q: 古いプロジェクトを GOPATH 配置のまま使い続けたい
A: GO111MODULE=off で可能ですが Go 1.22 以降は廃止。Modules 化を強く推奨します。
Q: go.sum って何?
A: 依存モジュールのハッシュ。改竄検知用。Git にコミットする慣例です。
Q: 別のモジュールパスに引っ越したい
A: go.mod の module 行を書き換え、コード内 import も一括置換。go mod tidy。