Go模块参考中的一节描述了最小模块兼容性的一些规则。本节中有一个条件列表,其中两个如下所示:
- 不存在
$GOPATH[i]/src/$modpath/$vn/$suffix
目录(对于任何根$GOPATH[i]
), - 文件
$GOPATH[d]/src/$modpath/go.mod
存在(对于某些根$GOPATH[d]
)并声明模块路径为$modpath/$vn
,
在这种情况下,$GOPATH[i]
和$GOPATH[d]
是什么?(假设我们知道$GOPATH
是什么)
如go
命令的文档所述:
GOPATH环境变量列出了查找Go代码的位置。在Unix上,该值是一个冒号分隔的字符串。在Windows上,该值是一个以分号分隔的字符串。在Plan 9中,该值为列表。
如果环境变量未设置,GOPATH默认为名为"go"在用户的主目录下(Unix为$ home/go, Windows为%USERPROFILE%go),除非该目录包含go发行版。Run "go env gpath& quot;查看当前的GOPATH。
(源)
因此,引用$GOPATH[i]
的语法只是用来描述GOPATH中的一个项目,正如我们所看到的,它可以是一个列表,而不仅仅是对单个路径的引用。
让我们假设我的Linux机器上有以下GOPATH
:/home/me/go:/gofaster
,并且我正在/home/me/go/src/example.com/testing
的项目中工作。
最小模块兼容性规则会说:对于要解决的依赖项example.com/utils/v2
, Go将检查:
- ,我没有一个包在
/home/me/go/src/example.com/testing/vendor/example.com/utils/v2
(即。供应商目录) - ,我没有一个包在
/home/me/go/src/example.com/utils/v2
,也没有在/gofaster/src/example.com/utils/v2
(即。检查两个路径)。 - 我在
/home/me/go/src/example.com/utils
或/gofaster/src/example.com/utils
中有一个包(注意缺少v2)。
如果我在这两个目录中都有一个包,那么它将被用来解决依赖关系。