最近、Goを勉強しているのですが、一番最初にハマったのは実は$GOPATH内で作業しなければならない、という部分でした。
個人的にはいろいろな技術を試す場所をPC内で独自に決めていたので(例えば~/workみたいに)、この制約苦しいな、と思っていたら、今はmodulesというものがあることを知りました。
これなら$GOPATHでない所でもパッケージが見つからない問題が解消しそうだと思い、試してました。
誰かの参考になれば、と思いメモしておきます。
環境
go version 1.12.1
作るもの
以下のような構成で、main.goからtest.goを呼び出すだけの簡単なプログラムを作ります。
.
├── main.go
└── test
└── test.go
package main
import (
"fmt"
"test"
)
func main() {
fmt.Println("main")
test.Test()
}
package test
import "fmt"
func Test() {
fmt.Println("test")
}
そしてmain.goを実行してみます。
するとtestなんてpackageはない、と怒られます。
:!go run main.go
main.go:5:3: cannot find package "test" in any of:
modulesでpackage問題を解消する
ここでmodulesの出番です。
以下のようなコマンドを打つことで、ここが"modtest"というモジュールであることをどうやら指定する模様。
実行するとgo.modというファイルが出来ます。これがモジュールを宣言することになっているようです。
go mod init modtest
あとはimport部分を以下のように修正する。
package main
import (
"fmt"
"modtest/test" // この部分をmodtest/testに修正する
)
func main() {
fmt.Println("main")
test.Test()
}
正しく実行できました。
:!go run main.go
main
test
modulesのことを知るまではdirenvとかで$GOPATHに現在のパスを指定する、など微妙に面倒なことをしていました。
参考
https://qiita.com/yoshinori_hisakawa/items/268ba201611401ca7935
https://qiita.com/spiegel-im-spiegel/items/5cb1587cb55d6f6a34d7