1.前言
網(wǎng)上的文章魚龍混雜测垛,且都只是給結(jié)論捏膨,你根本不知道誰說的是對(duì)的,誰是錯(cuò)的食侮,為了得到可信的結(jié)論号涯,于是有了這篇文章,所謂——實(shí)踐出真知锯七。
2.實(shí)驗(yàn)過程
前期準(zhǔn)備
在GOPAHT外部建立目錄 my-app:
midir my-app
進(jìn)入my-app链快,編寫程序, vim main.go:
package main
import "github.com/astaxie/beego"
func main() {
beego.Run()
}
1. GO111MODULE="on":
1.1 不在$GOPATH/src目錄下
- 開啟GO MOD:
go env -w GO111MODULE="on"
- 生成go.mod :
go mod init my-app
-
執(zhí)行
go mod tidy
,自動(dòng)下載包到$GOPATH/pkg/mod:
vim $GOPATH/pkg/mod/github.com/astaxie/beego@v1.12.3/beego.go
增加一行 (58行) :
fmt.Println("mod")
當(dāng)然記得要引入包:import "fmt"
-
執(zhí)行
go run main.go
可以證明確實(shí)讀取了 $GOPATH/pkg/mod的beego眉尸。 生成 vendor域蜗,執(zhí)行
go mod vendor
my-app下執(zhí)行
vim vendor/github.com/astaxie/beego/beego.go
,
還是增加一行 (58行) :
fmt.Println("vendor")
如圖所示:
- 執(zhí)行
go run main.go
可以看到此時(shí)優(yōu)先讀取了 vendor里面的外部包
1.2 在$GOPATH/src目錄下
- 復(fù)制my-app的目錄到$GOPATH/src目錄下
- 執(zhí)行
go run main.go
可以看到優(yōu)先讀取的還是vendor - 執(zhí)行
rm -rf vendor
- 再次 執(zhí)行
go run main.go
依然讀的是mod的噪猾。
2. GO111MODULE="off"
先執(zhí)行命令:
go env -w GO111MODULE="off"
此時(shí)我的配置如下:
2.1 GO111MODULE="off"且項(xiàng)目不在 $GOPATH/src下
-
還是之前在GOPATH/src下面:
執(zhí)行
vim $GOPATH/src/github.com/astaxie/beego/beego.go
還是之前的位置,改為
fmt.Println("src")
- 執(zhí)行
go run main.go
直接讀取的是 $GOPATH/src下面的包袱蜡。
2.2 GO111MODULE="off"且項(xiàng)目在 $GOPATH/src下
- 還是之前在GOPATH/src;
- 在 $GOPATH/src/my-app 執(zhí)行
go run main.go
發(fā)現(xiàn)竟然讀的是vendor的坪蚁。 - 執(zhí)行:
mv vendor vendor_bak
即去除vendor的影響奔穿,再執(zhí)行go run main.go
這回讀取的就是src的了镜沽。
3. GO111MODULE="auto"
執(zhí)行:
go env -w GO111MODULE="auto"
修改后環(huán)境變量如下:
3.1 沒有g(shù)o.mod 且項(xiàng)目在$GOPATH/src下
注意:記得要在:GOPATH/pkg/mod, vendor里面的beego包加入了之前的調(diào)試語句:
fmt.Println("src")
fmt.Println("mod")
fmt.Println("vendor")
-
目錄文件如下:
-
執(zhí)行
go run main.go
居然報(bào)錯(cuò)了:
-
看看$GOPATH/src是否有包贱田,
ls /mnt/d/GoProjects/src/github.com/astaxie/beego
:
包是有的缅茉。 -
執(zhí)行一下:
go get -v github.com/astaxie/beego
-
再運(yùn)行:
go run main.go
,發(fā)現(xiàn)可以了:
-
猜想走的是
$GOPATH/pkg/mod
里面的包男摧,改了一下蔬墩,vim /mnt/d/GoProjects/pkg/mod/github.com/astaxie/beego@v1.12.3/beego.go
:
-
再運(yùn)行:
go run main.go
,證實(shí)了:
-
開啟vendor彩倚,目錄結(jié)構(gòu)如下:
-
運(yùn)行:
go run main.go
還是走mod筹我。
查閱資料發(fā)現(xiàn),只要main.go依賴的包用了go.mod帆离,則默認(rèn)會(huì)啟用GOMODULE來下載依賴蔬蕊。
3.2 沒有g(shù)o.mod 且項(xiàng)目不在$GOPATH/src下
按3.1的流程跑了一遍,測(cè)試結(jié)果同上哥谷。
-
目錄結(jié)構(gòu):
- 運(yùn)行:
go run main.go
走的是mod -
開啟vendor岸夯,目錄結(jié)構(gòu):
- 運(yùn)行:
go run main.go
還是走的是mod。
意味著们妥,GO111MODULE="auto" 的情況下猜扮,只要依賴包包含了go.mod,那么無論有沒有vendor监婶,無論在不在$GOPATH/src下旅赢,都會(huì)開啟mod,并走mod的外部引入包惑惶。
3.3 有g(shù)o.mod 且項(xiàng)目不在$GOPATH/src下
-
目錄結(jié)構(gòu):
-
運(yùn)行:
go run main.go
即有vendor情況下走的是vendor -
我們執(zhí)行以下命令
mv vendor vendor_bak
去除vendor影響煮盼,目錄結(jié)構(gòu):
-
運(yùn)行:
go run main.go
走的是mod。
3.4 有g(shù)o.mod 且項(xiàng)目在$GOPATH/src下
-
目錄結(jié)構(gòu):
-
運(yùn)行:
go run main.go
即有vendor是直接走vendor -
我們執(zhí)行以下命令
mv vendor vendor_bak
去除vendor影響带污,目錄結(jié)構(gòu):
-
運(yùn)行:
go run main.go
走的是mod僵控。
3.結(jié)論
1.GO111MODULE="on"
1.1 GO111MODULE="on" 且項(xiàng)目不在 $GOPATH/src下
- 當(dāng)vendor目錄存在,優(yōu)先讀取vendor的外部包
- 當(dāng)vendor目錄不存在鱼冀,讀取$GOPATH/pkg/mod下的外部包
1.2 GO111MODULE="on" 且項(xiàng)目在 $GOPATH/src下
跟上面情況(GO111MODULE="on" 且項(xiàng)目不在 $GOPATH/src下)一致报破。
2. GO111MODULE="off"
2.1.GO111MODULE="off" 且項(xiàng)目不在 $GOPATH/src下
- 無論有沒有vendor,直接讀取$GOPATH/src里面的外部引入包千绪,即不會(huì)讀取vendor里面的包
2.2.GO111MODULE="off" 且項(xiàng)目在 $GOPATH/src下
- 有vendor則讀取vendor的外部引入包
- 沒有vendor則讀取$GOPATH/src里面的外部引入包
3.GO111MODULE="auto"
3.1 沒有g(shù)o.mod 且項(xiàng)目不在$GOPATH/src下
- 沒有vendor充易,且依賴的包里面有g(shù)o.mod,直接走$GOPATH/pkg/mod
- 沒有vendor荸型,且依賴的包里面都沒有g(shù)o.mod蔽氨,直接走$GOPATH/src (待驗(yàn)證)
- 有vendor,也沒有用,只要依賴的包里面有g(shù)o.mod鹉究,還是走$GOPATH/pkg/mod
- 有vendor,且依賴的包里面都沒有g(shù)o.mod踪宠,走$GOPATH/src (待驗(yàn)證)
3.2 沒有g(shù)o.mod 且項(xiàng)目在$GOPATH/src下
- 沒有vendor自赔,且依賴的包里面有g(shù)o.mod,直接走$GOPATH/pkg/mod
- 沒有vendor柳琢,且依賴的包里面都沒有g(shù)o.mod绍妨,直接走$GOPATH/src (待驗(yàn)證)
- 有vendor,也沒有用柬脸,只要依賴的包里面有g(shù)o.mod他去,還是走$GOPATH/pkg/mod
- 有vendor,且依賴的包里面都沒有g(shù)o.mod倒堕,走vendor (待驗(yàn)證)
3.3 有g(shù)o.mod 且項(xiàng)目不在$GOPATH/src下
- 有vendor, 則讀取vendor的外部引入包
- 沒有vendor則讀取$GOPATH/pkg/mod里面的外部引入包
3.4 有g(shù)o.mod 且項(xiàng)目在$GOPATH/src下
與上面的情況(有g(shù)o.mod 且項(xiàng)目不在$GOPATH/src下)一致灾测。