Go 包管理與依賴查找順序


1. 規則:

  • 同一目錄下只能存在一個包
  • 目錄和目錄下源文件的包命名可以不同
  • 當包名與目錄名不同時,導入的是目錄

2. 編譯時的依賴包查找機制

在 Go 支持 Go Modules 之后,編譯時編譯器會從工作目錄(當前所在目錄)開始並逐級向上查找是否具有 go.mod 文件。

  • 如果有,go.mod 文件中聲明的 module 名稱就視作 go.mod 所在的路徑,然后以指定的 main 包為依賴入口,所有以 go.mod 中聲明的 module 名稱開頭的導入路徑都以 go.mod 所在的路徑為相對路徑進行包的查找導入。所有需要導入的路徑中如果在 go.mod 中指定了版本,則從 $GOPATH/pkg/mod/ 下取得相應版本進行導入,如果沒有被指定則從 $GOPATH/src/ 或 $GOROOT/src/ 中進行查找導入。
  • 如果沒有,所有依賴均從 $GOPATH/src/$GOROOT/src/ 中進行查找導入。

3.vendor

vendor概念最早是由Keith提出,用來存放依賴包。

vendor的層級搜索

規則是:

  1. 從引用文件所在的vendor路徑下面搜索,
  2. 如果沒有找到,那么從上層目錄的vendor路徑下面搜索,
  3. 直到srcvendor路徑下面搜索。

4. modules

Go 1.11版本支持臨時環境變量GO111MODULE,通過該環境變量來控制依賴包的管理方式。

查找順序

GO111MODULE=on時,那么就會使用modules功能:
這種模式下,$GOPATH不再作為build時導入的角色,依賴包會存放在$GOPATH/pkg/mod目錄下。工程中的依賴包也會從此目錄下查找.

GO111MODULE=off時,如果一個包在vendor$GOPATH下都存在,那么使用順序為:

  1. 優先使用vendor目錄下面的包,
  2. 如果vendor下面沒有搜索到,再搜索$GOPATH/src下面的包,
  3. 如果$GOPATH下面沒有搜索到,那么搜索$GOROOT/src下面的包,
  4. 要么完整使用vendor下面的包,要么完整使用$GOPATH下面的包,不會混合使用。

參考:

https://studygolang.com/articles/22793?fr=sidebar

https://blog.csdn.net/benben_2015/article/details/91455497

下一章,學習一下vendor和modules


免責聲明!

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



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