プロジェクト内の他パッケージを絶対パスでimportする際の僕の勘違い

やろうとしたこと

  • mainパッケージにおいて別ディレクトリに入れている別パッケージを相対パスではなく絶対パスで読み込ませる
  • import "github.com/ユーザー名/レポジトリ名/パッケージ名" の形式でインポートしたい

環境

ディレクトリ構造

.(プロジェクトルート)
├── README.md
├── config
│   └── router.go ←configパッケージ
├── go.mod
├── go.sum
└── main.go  ←mainパッケージ

出てきたエラー

  • 絶対パスでのimportの記載箇所で could not import github.com/Tiratom/gin-study/config (no required module provides package "github.com/Tiratom/gin-study/config")

※Tiratomは僕のGitHubのアカウント名、gin-studyはレポジトリ名です。 main.goにおいて、gin-study/configというインポートは成功することは確認しました。また、router.goをGitHubにプッシュしました。その状態でconfigパッケージを絶対パスでインポートしようとしたのですが、前述のインポートできませんよエラーが発生しました。main.goは以下のように記述していました。

package main

// import "gin-study/config"
import "github.com/Tiratom/gin-study/config"

func main() {
    r := config.GetRouter()
    r.Run(":8080")
}

解決策

Goのpackageを作ろうとしたらgo.modの作り方で困った件 - Qiita

を参考にさせていただきました。

go.modのmoduleの値をもともとはmodule gin-study としていましたが、module github.com/Tiratom/gin-study に修正したところ、無事importでエラーが発生しなくなりました。

補足・メモ

Modules · golang/go Wiki · GitHub において、

A module declares its identity in its go.mod via the module directive, which provides the module path. The import paths for all packages in a module share the module path as a common prefix. The module path and the relative path from the go.mod to a package's directory together determine a package's import path.

という記述があります。 go.modのmoduleに設定した値がインポートパスの共通プレフィックスとなるため、moduleの値がgin-studyにしていたときはインポートがgin-study/configなら成功するけどgithub.com... だと成功しない、という状態になっていたようです。(インポートのパスはGitHubのURLを元につけるのだと勘違いしていました・・・)

また、import "gin-study/config" でも絶対パスのインポートはできていたのですが、import "github.com/..." という形式でのインポートが正だとばかり思っていたので誤った方法でのインポートしかできていないと思い込んでいました。

github.com... のimportはGitHubにプッシュした後でないと行えないと思っていたのですが、上記の理由から別にプッシュしてなくてもimportできるようですね。

多岐にわたって理解が甘く様々な箇所で勘違いをしていました。