🎉
Goのimportで相対パスが使えなかった時の対処法
はじめに
相対パスによるimportをしようとしたら* is relative, but relative import paths are not supported in module modeというエラーが出てきました。
そこでどのようにすればエラーなくパッケージをimportできるのか調べてみることに。
その結果どうやら相対パスではなく、モジュールというものを使ってパスを書かなければいけないということで実際に試しました。
エラー発生時のファイル構成と記述
ファイル構成
foods
|-fruits
|-apple.go
|-banana.go
|-grape.go
|-main.go
|-app.go
apple.go
package fruits
func VarietyOfApple() string {
return "Fuji"
}
banana.go
package fruits
func VarietyOfBanana() string {
return "Cavendish"
}
grape.go
package fruits
func VarietyOfGrape() string {
return "Delaware"
}
app.go
package main
func AppName() string {
return "Foods Application"
}
main.go
package main
import (
"fmt"
"./fruits"
)
func main() {
fmt.Println(AppName())
fmt.Println(fruits.VarietyOfApple())
fmt.Println(fruits.VarietyOfBanana())
fmt.Println(fruits.VarietyOfGrape())
}
main.goの"./animals"
の部分で相対パスによりimportしようとしているのがおそらく原因です。
そこでfoodsディレクトリにモジュールを作成し、そのモジュールを使ってパスを書いてみました。
対応策
ターミナル
$ go mod init foods
を実行します。
そうすると以下のファイルが作成されました。これでfoodsディレクトリの中身がfoodsモジュールとしてコレクションされたといえると思います。
go.mod
module foods
go 1.24.2
次にmain.goのimport部分を修正します。
main.go
package main
import (
"fmt"
+ "foods/fruits"
- "./fruits"
)
func main() {
fmt.Println(AppName())
fmt.Println(fruits.VarietyOfApple())
fmt.Println(fruits.VarietyOfBanana())
fmt.Println(fruits.VarietyOfGrape())
}
この状態でmain.goとapp.goを実行してみましょう。
ターミナル
$ go run main.go app.go
Foods Application
Fuji
Cavendish
Delaware
うまく動かすことができました!
Discussion