什么是$GOPATH[i]和$GOPATH[d]?



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)。

如果我在这两个目录中都有一个包,那么它将被用来解决依赖关系。

最新更新