Golang Vendor 包機制 及 注意事項


現在的 Go 版本是 1.8,早在 1.5 時期,就有了 Vendor 包機制,詳情可查看博文:“理解 Go 1.5 vendor”。

遇到的問題

個人在使用 Glide 管理 Vendor 包時(附:Golang Vendor 包管理工具 glide 使用教程),老編譯不成功! 后來猛地發現,原來是我對 Vendor 包機制理解不夠深入導致的。

Glide 官方教程中提供了一個 Demo 項目結構,如下所示:

$GOPATH/src/myProject (Your project)
  |
  |-- glide.yaml
  |
  |-- glide.lock
  |
  |-- main.go (Your main go code can live here)
  |
  |-- mySubpackage (You can create your own subpackages, too)
  |    |
  |    |-- foo.go
  |
  |-- vendor
       |-- github.com
            |
            |-- Masterminds
                  |
                  |-- ... etc.

我改了一下,去掉了目錄結構中的 myProject 文件夾,如下所示:

$GOPATH/src
  |
  |-- glide.yaml
  |
  |-- glide.lock
  |
  |-- main.go (Your main go code can live here)
  |
  |-- mySubpackage (You can create your own subpackages, too)
  |    |
  |    |-- foo.go
  |
  |-- vendor
       |-- github.com
            |
            |-- Masterminds
                  |
                  |-- ... etc.

然后 go build 一直提示找不到相關的包(其實 glide 已經把它下載到 vendor 目錄中了) 。

后來回過頭看 “理解 Go 1.5 vendor”,里面有一段有關 Vendor 的英文介紹:

If there is a source directory d/vendor, then, when compiling a source file within the subtree rooted at d, import "p" is interpreted as import "d/vendor/p" if that exists.

When there are multiple possible resolutions,the most specific (longest) path wins.

The short form must always be used: no import path can  contain “/vendor/” explicitly.

Import comments are ignored in vendored packages.

它的大體意思就是,當有包路徑 "d/vendor/p" 時,可以使用 import "p" 的簡短形式來代替! 

其實,它還隱藏着另外一個非常重要的細節,即:

vendor 目錄不能放到 工作空間源碼包目錄的根目錄($GOPATH/src)之下,必須放到 某個(項目)文件夾之下,如下面的  myProject 文件夾:

$GOPATH/src/myProject (Your project)
  |
  |-- glide.yaml
  |
  |-- glide.lock
  |
  |-- main.go (Your main go code can live here)
  |
  |-- vendor
       |-- github.com
            |
            |-- Masterminds
                  |
                  |-- ... etc.

好吧,接下來一切都很順利!

 

 

相關文章:

【Go入門教程1】Go 安裝,GOROOT,GOPATH,Go工作空間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM