• home
  • Golangのvendor管理周りでちょっとハマった

Golangのvendor管理周りでちょっとハマった

vendor管理 / glide

Goは1.5あたりからプロジェクトのvendorディレクトリ内のパッケージをグローバルより優先して見に行く設定にできる。

export GO15VENDOREXPERIMENT=1

 

プロジェクト毎のvendor管理のためにパッケージ管理ツールglide などを使うと、基本的にプロジェクトのvendor内に3rdパーティのパッケージがインストールされていく。

glide get した依存モジュールはglide.yamlに自動追記され、vendor以下がバージョン管理対象外でも glide install で別環境でも復元できるようになる。

要するに「プロジェクトごとにモジュールのバージョンとか固定しようぜ」っていう、package.json的なものに近い。

サブパッケージ内からvendor内のパッケージが見つからない

そこで、main.goがsubpackage内のモジュールを呼ぶこういう感じになるとする。
 


projectName │  ├── subpackage │   ├── example │   │   └── example.go │   └───example2 │      └── example2.go ├── glide.lock ├── glide.yaml ├── main.go └── vendor    ├── github.com ├── aws ....

 

上記の構成でいうexample.goからawsをimportしたところ、cannot find package...で怒られた。
結論から言うと、原因はここにかいてあった通りだった。

ダメ

main.go

import (
    "./subpackage/sub"
)
func main() {
    sub.Run()
}

OK

main.go

import (
    "projectName/subpackage/sub"
)
func main() {
    sub.Run()
}

下だと動く。
相対パスでのimportで入れたパッケージからもグローバルのパッケージは呼べたので油断していたが、vendor内にアクセスするには、対象がそのプロジェクトの一部だということを明示しないといけない?っぽい。