1.

Go go.mod file not found の原因と対処完全ガイド

編集
この記事の要点
  • 原因: Go Modules モードで動作しているのに go.mod が無い、または親ディレクトリにも見つからない
  • 対処: 新規プロジェクトは go mod init github.com/user/project で初期化
  • 既存プロジェクト: ルートで go mod init 実行後、go mod tidy で依存解決
  • Go 1.16+ は GO111MODULE=on がデフォルト。旧 GOPATH モードは廃止
  • プライベートリポジトリ依存は GOPRIVATE 環境変数で proxy 回避
  • Vendor 利用: go mod vendorgo build -mod=vendor

エラー内容

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
GO111MODULEoffon (デフォルト)

対処 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
社内 Gitgit.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 <<EOF
machine github.com
login myuser
password ghp_XXXXXXXXXXXXXXXXXXXX
EOF
chmod 600 ~/.netrc

# sumcheck も無効化したい場合
go env -w GONOSUMCHECK=git.corp.example.com
go env -w GONOSUMDB=git.corp.example.com

対処 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 vendorvendor/ に同梱
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.modmodule 行を書き換え、コード内 import も一括置換。go mod tidy

編集
Post Share
子ページ

子ページはありません

同階層のページ

同階層のページはありません

最近更新/作成されたページ