LoginSignup
3
1

More than 5 years have passed since last update.

Go 1.6 から導入された Vendoring 機能でインポートされるライブラリの優先順位

Posted at

概要

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 が読み込まれることはない。

3
1
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
3
1