概要
Go 1.6 から標準機能になった、外部のライブラリを本体のソースコードとは別の場所で管理できるようになった Vendoring 機能で読み込まれるディレクトリの優先順位を確認してみました。
結論
- 実行するソースコードと同じ場所、なければ親ディレクトリにあるライブラリ
-
vendor
があれば優先 -
src
ディレクトリが最上位
例外
src/mypackage/main.go
から親ディレクトリの src/vendor/lib/lib.go
は読み込まれるが、src/main.go
からは同じ場所にある src/vendor/lib/lib.go
は読み込まれない。
※ src
直下の場合のみ挙動が異なる。
検証
$GOPATH のディレクトリ構成
$ tree
.
├── src
│ ├── lib
│ │ └── lib.go
│ ├── main.go
│ ├── mypackage
│ │ ├── lib
│ │ │ └── lib.go
│ │ ├── main.go
│ │ └── vendor
│ │ └── lib
│ │ └── lib.go
│ └── vendor
│ └── lib
│ └── lib.go
└── vendor
└── lib
└── lib.go
10 directories, 7 files
ソースコード
main.go
package main
import (
"lib"
)
func main() {
lib.Execute()
}
lib.go
package lib
import "fmt"
func Execute() {
// 実行されるソースコードの場所を出力
fmt.Println("src/lib/lib.go")
}
検証結果
テスト1
$ cd $GOPATH
$ go run src/main.go
src/lib/lib.go
$ rm -R src/lib
$ go run src/main.go
src/main.go:4:5: cannot find package "lib" in any of:
/usr/local/Cellar/go/1.7.4_1/libexec/src/lib (from $GOROOT)
/Users/aiba/.go/src/lib (from $GOPATH)
src/main.go
から src/vendor/lib/lib.go
が読み込まれることはない。
テスト2
$ cd $GOPATH
$ go run src/mypackage/main.go
src/mypackage/vendor/lib/lib.go
$ rm -R src/mypackage/vendor
$ go run src/mypackage/main.go
src/vendor/lib/lib.go
$ rm -R src/vendor
$ go run src/mypackage/main.go
src/lib/lib.go
$ rm -R src/lib
$ go run src/mypackage/main.go
src/mypackage/main.go:4:5: cannot find package "lib" in any of:
/usr/local/Cellar/go/1.7.4_1/libexec/src/lib (from $GOROOT)
/Users/aiba/.go/src/lib (from $GOPATH)
src
より上位にある vendor/lib/lib.go
が読み込まれることはない。