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的層級搜索
規則是:
- 從引用文件所在的
vendor
路徑下面搜索, - 如果沒有找到,那么從上層目錄的
vendor
路徑下面搜索, - 直到
src
的vendor
路徑下面搜索。
4. modules
Go 1.11版本支持臨時環境變量GO111MODULE
,通過該環境變量來控制依賴包的管理方式。
查找順序
當GO111MODULE
=on
時,那么就會使用modules
功能:
這種模式下,$GOPATH
不再作為build時導入的角色,依賴包會存放在$GOPATH/pkg/mod
目錄下。工程中的依賴包也會從此目錄下查找.
GO111MODULE=off
時,如果一個包在vendor
和$GOPATH
下都存在,那么使用順序為:
- 優先使用
vendor
目錄下面的包, - 如果
vendor
下面沒有搜索到,再搜索$GOPATH/src
下面的包, - 如果
$GOPATH
下面沒有搜索到,那么搜索$GOROOT/src
下面的包, - 要么完整使用
vendor
下面的包,要么完整使用$GOPATH
下面的包,不會混合使用。
參考:
https://studygolang.com/articles/22793?fr=sidebar
https://blog.csdn.net/benben_2015/article/details/91455497
下一章,學習一下vendor和modules