やろうとしたこと
- 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できるようですね。
多岐にわたって理解が甘く様々な箇所で勘違いをしていました。