GOVCS环境变量配置哪些包使用哪个版本控制软件来下载

$go help vcs

go get命令可以运行类似git这样的版本控制命令来下载代码。这个功能对非中心化(分布式)存储的Go包生态系统很重要,可以从任意服务器下载Go包代码,但是这也有一个潜在的安全问题,例如一个恶意的服务器故意让go get下载并运行恶意代码。

为了均衡考虑功能和安全性,go get命令默认只会使用git或hg从公共服务器下载代码。但它也会使用任意知名的版本控制系统(bzr、 fossil、git、hg、svn)来从私有服务器下载代码,私有服务器的网址由GOPRIVATE环境变量给出(更多信息参见go help private命令的输出)。只使用Git或Mercurial下载公共服务器里的Go包代码的理由是,这两个版本控制系统最关注作为不受信任的服务器的客户端运行时的相关问题。相反,Bazaar、Fossil和Subversion主要用于受信任的有权限的环境,但并没有在安全性方面做好工作。

当只有直接从版本控制系统下载代码的时候,版本控制命令才会受到一点限制。当从一个代理下载模块代码时,go get使用代理协议来下载。默认情况下,go get下载公共包会从Go模块镜像站(proxy.golang.org)下载,除非遇到因法律等原因无法从该镜像站下载的公共包或者私有包。默认情况下,go get能从Bazaar、Fossil或Subversion这些版本控制系统里下载代码,也是从Go模块镜像站下载,但是通过冒一定的安全性风险使用一个定制的沙盒运行代码版本控制命令。

GOVCS环境变量可用于更改特定包(由模块或导入路径标识)的允许的版本控制系统。GOVCS环境变量在模块模式和GOPATH模式下构建包时都适用。使用模块模式时,GOVCS环境变量的值会去匹配模块路径;使用GOPATH模式时,匹配版本控制存储库的根目录对应的导入路径。

GOVCS环境变量的值的一般形式是以逗号分隔的模式匹配列表:vcslist规则。该模式匹配是一个glob模式,必须与模块或导入路径的一个或多个前导元素匹配。vcslist是允许的版本控制命令的管道分隔列表,或用“all”表示允许使用任何已知的命令,或用“off”表示禁用所有命令。请注意,如果某个模块与vcslist为“off”的模式匹配,则如果源服务器使用“mod”方案,则该模块仍可能被下载,该方案指示go命令使用GOPROXY协议下载该模块。优先使用GOVCS列表中最前面(左边)列出的匹配模式,即使后面的模式也可能匹配。

例如:

GOVCS=github.com:git,evil.com:off,*:git|hg

通过这一设置,导入路径以github.com/开头的Go模块只能使用git下载,导入路径以evil.com开头的Go模块不能被任何版本控制命令下载,其他所有包(*号匹配所有)只能使用git或hg下载。

特殊的模式”public”和”private”分别匹配公共的或私有的模块或导入路径。如果某个包路径匹配GOPRIVATE环境变量的值,那这个包就是私有的,否则就是公共的。

如果在GOVCS环境变量里没有列出任何匹配规则,go get命令就会使用它的默认规则——用GOVCS来表达就是”public:git|hg,private:all”。

要不受限制地使用任意版本控制系统下载任意Go包,使用:GOVCS=*:all

要禁用所有版本控制系统,使用:GOVCS=*:off

go env -w命令可以用来设置GOVCS环境变量的值,给未来的go命令使用。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注