LoginSignup
5
3

More than 3 years have passed since last update.

Goのmodules を使い始めたばかりでbuild出来ずに困った話

Posted at

Go moduleを使い始めたばかりでbuildが通らず困った話

Hello Worldを終えて、少しすると、main.goで定義していた関数を別のディレクトリに切り出したくなる時がくると思います。
その時にbuild通らず、解決するのに時間がかかりました。
go moduleを使わず、GOPATH配下にプロジェクトのディレクトリを作る際と、goのmodulesを使う時で外部パッケージの呼び出し方のパスの指定方法に違いがあります。現状、Web上の情報も古い情報の方が多く、
結構、盲点であると思いましたので、覚書として残します。

Goのバージョン
$ go version
>> go version go1.13.4 darwin/amd64

何が困ったか?

piyo
├── go.mod
├── go.sum
└── main.go
main.go
package main
import "fmt"

main(){
    hoge()
    fuga()
    return nil
}

func hoge() {
    fmt.Println("hogehoge")
}

func fuga() {
    fmt.Println("fugafuga")
}

上記のようなプロジェクトを下記のように、関数を別のディレクトリへ分割したい。

piyo
├── go.mod
├── go.sum
├── main.go
└── cmd
    ├── hoge.go
    └── fuga.go

なので、次のようにファイルを分割した。

main.go
package main
import (
    "fmt"
    "./cmd"
)
main(){
    cmd.hoge()
    cmd.fuga()
    return nil
}
hoge.go
package cmd
func Hoge() { // パッケージ外部から呼ばれるので関数名の先頭を大文字にする。
    fmt.Println("hogehoge")
}
fuga.go
package cmd
func Fuga() { // パッケージ外部から呼ばれるので関数名の先頭を大文字にする。
    fmt.Println("fugafuga")
}

ここで、buildするとエラーが出てbuild出来ない!

$ go build
>> build _/Users/username/workspace_golang/github.com/username/piyo/cmd: cannot find module for path _/Users/username/workspace_golang/github.com/username/piyo/cmd

... cannot find module for path ...という事は、piyoディレクトリを見つける事が出来ないという事っぽいけど。。。

結論からいうと、importするパッケージを相対パスでは無く、絶対パスでしてすればbuildが通りました!

もう少し詳しく再現してみる。

Go modulesを使う

Goでは、modulesというものがgo 11.1から使えるようになりました。

詳しい内容は、様々な記事や公式ドキュメントにありますが、今までと何が違うかというとGOPATHの外にいても外部のパッケージを使えるという事であると思います。

必ずGOPATH傘下にプロジェクトのディレクトリを作らなくてならないのは、不自由だなと思いますので、これはいいと取り入れて行きます。

$ mkdir workspace_golang
$ cd workspace_golang
$ mkdir piyo
$ cd piyo
$ go mod init github.com/username/piyo

このようにGOPATHの外のhomeディレクトリ直下にworkspace_golangという勉強用ディレクトリを作成し、そこにプロジェクトのディレクリを作成しました。

buildが通ったmain.go

main.go
package main
import (
    "fmt"
    - "./cmd"
    + "github.com/username/piyo/cmd
)
main(){
    cmd.hoge()
    cmd.fuga()
    return nil
}

結論

go moduleを使ったら外部パッケージから関数等を呼ぶときは絶対パスで呼ぶ!

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3