关于go mod的on,off,auto下引入外部包读取顺序的探

2021-09-06  本文已影响0人  10xjzheng

1.前言

网上的文章鱼龙混杂,且都只是给结论,你根本不知道谁说的是对的,谁是错的,为了得到可信的结论,于是有了这篇文章,所谓——实践出真知。

2.实验过程

前期准备

package main

import "github.com/astaxie/beego"

func main() {
    beego.Run()
}

1. GO111MODULE="on":

1.1 不在$GOPATH/src目录下

go env -w GO111MODULE="on"

go mod init my-app
image.png
fmt.Println("mod")

当然记得要引入包:import "fmt"

image.png
fmt.Println("vendor")

如图所示:


image.png

1.2 在$GOPATH/src目录下

2. GO111MODULE="off"

先执行命令:

go env -w GO111MODULE="off"

此时我的配置如下:


image.png

2.1 GO111MODULE="off"且项目不在 $GOPATH/src下

fmt.Println("src")
image.png

2.2 GO111MODULE="off"且项目在 $GOPATH/src下

3. GO111MODULE="auto"

执行:

 go env -w GO111MODULE="auto"

修改后环境变量如下:


image.png

3.1 没有go.mod 且项目在$GOPATH/src下

注意:记得要在:GOPATH/src,GOPATH/pkg/mod, vendor里面的beego包加入了之前的调试语句:

fmt.Println("src")
fmt.Println("mod")
fmt.Println("vendor")

还是走mod。

查阅资料发现,只要main.go依赖的包用了go.mod,则默认会启用GOMODULE来下载依赖。

3.2 没有go.mod 且项目不在$GOPATH/src下

按3.1的流程跑了一遍,测试结果同上。

意味着,GO111MODULE="auto" 的情况下,只要依赖包包含了go.mod,那么无论有没有vendor,无论在不在$GOPATH/src下,都会开启mod,并走mod的外部引入包。

3.3 有go.mod 且项目不在$GOPATH/src下

走的是mod。

3.4 有go.mod 且项目在$GOPATH/src下

3.结论

1.GO111MODULE="on"

1.1 GO111MODULE="on" 且项目不在 $GOPATH/src下

1.2 GO111MODULE="on" 且项目在 $GOPATH/src下

跟上面情况(GO111MODULE="on" 且项目不在 $GOPATH/src下)一致。

2. GO111MODULE="off"

2.1.GO111MODULE="off" 且项目不在 $GOPATH/src下

2.2.GO111MODULE="off" 且项目在 $GOPATH/src下

3.GO111MODULE="auto"

3.1 没有go.mod 且项目不在$GOPATH/src下

3.2 没有go.mod 且项目在$GOPATH/src下

3.3 有go.mod 且项目不在$GOPATH/src下

3.4 有go.mod 且项目在$GOPATH/src下

与上面的情况(有go.mod 且项目不在$GOPATH/src下)一致。

上一篇 下一篇

猜你喜欢

热点阅读