为什么GOPROXY很重要,该选择哪个

注意:本博客已更新,以反映JFrog GoCenter的日落.
从Go 1.13开始,Go模块是Golang中的标准包管理器,在安装时与默认的GOPROXY一起自动启用。
但是有了GOPROXY和你自己的Go模块包,你需要在公共视野中保持安全,你应该选择什么样的配置呢?如何避免公共和私有Golang资源纠缠在一起?2022世界杯阿根廷预选赛赛程
让我们来看看GOPROXY的用途,以及为快速、可靠和安全的系统设置GOPROXY的一些方法。
什么是GOPROXY?
GOPROXY控制Go模块下载的源代码,可以帮助确保构建是确定的和安全的。
在GOPROXY时代之前,在Golang中进行开发时,模块依赖项直接从VCS系统(如GitHub、Bitbucket、Bazaar、Mercurial或SVN)中的源存储库中下载。来自第三方的依赖关系通常从公共资源回购中下载。私有依赖项必须通过存储它们的VCS系统进行身份验证才能下载模块源文件。

虽然上面的工作流被广泛使用,但它缺乏确定性和安全构建和开发过程的两个基本要求:不可变性和可用性。作者可以删除模块,也可以编辑版本。虽然这些场景被认为是不好的实践,但它们确实经常发生。
使用GOPROXY
为Golang开发或CI环境设置GOPROXY将Go模块下载请求重定向到缓存存储库。
对模块依赖项使用GOPROXY有助于实现不可变性需求。通过从GOPROXY的缓存中返回模块,它总是为所请求的版本提供相同的代码,即使该模块最近在VCS repo中被不恰当地修改过。
GOPROXY的缓存还有助于确保模块始终可用,即使VCS repo中的原始模块已被销毁。
有不同的方法来使用GOPROXY,这取决于您希望使用的go模块依赖关系的来源。
公共GOPROXY
公共GOPROXY是一个集中式存储库,供全球的Golang开发人员使用。它承载着开源的Go模块,这些模块已经在公开可访问的VCS项目存储库中从第三方获得。大多数,像proxy.golang.org免费提供给Golang开发者社区。

要使用公共GOPROXY,请将Golang环境变量设置为其URL:
$ export GOPROXY=https://proxy.golang.org
上述设置将所有模块下载请求重定向到由Golang团队维护的Go模块存储库。从公共GOPROXY下载可以快得多而不是直接从VCS,通过下载模块存档文件.
除了实现下载之外,公共GOPROXY还可以为GoLang开发人员提供关于它所包含的模块的更详细信息。的UIpkg.go.dev使您能够搜索模块并提供一些基本统计信息。
私人围棋模块
通常,GoLang项目同时使用开源和私有模块依赖。有些用户使用GOPRIVATE环境变量指定必须绕过GOPROXY和GOSUMDB的路径列表,并直接从这些VCS reppos下载私有模块。例如,您可能想使用proxy.golang.org检索所有开源模块,但只从您公司的服务器请求私有模块。

要使用这个公共GOPROXY和私有模块,请设置Golang环境变量:
$ export GOPROXY=https://proxy.golang.org,direct $ export GOPRIVATE=*.internal.mycompany.com
使用GOPRIVATE还可以确保您对这些私有模块的使用不会通过向开放网络上的公共GOPROXY和校验和数据库服务器的请求而“泄露”。另一种替代方法是使用包含私有go模块引用的GONOSUMDB变量。虽然此配置使Go客户端能够解析公共和私有模块依赖关系,但它并没有强制私有模块的不可变性或可用性要求。
私人GOPROXY
私有GOPROXY是您安装用于在自己的基础设施上存储公共和私有Go模块的GOPROXY。
通过在二进制存储库管理器(如JFrog Artifactory)中代理一个公共GOPROXY在本地缓存公共模块。私有模块也从它们的VCS回购缓存到存储库中。通过这种方式,可以保证公共和私有Go模块的不可变性和可用性。
在Artifactory中,用于远程存储库的组合proxy.golang.org,一个远程Go模块存储库指向私有的GitHub reppos(私有模块)和一个本地Go模块存储库可以组合成一个单一的虚拟存储库,作为单个单元访问。

在Artifactory中将GOPROXY设置为名为“go”的虚拟存储库:
$ export GOPROXY="https://:@my.artifactory. "server/artifactory/api/go/go $ export GONOSUMDB="github.com/mycompany/*,github.com/mypersonal/*"
由于私有VCS回购中的模块在公共校验和数据库中将没有条目sum.golang.org,它们必须被go客户端排除在监督检查之外。将GONOSUMDB设置为您的私有VCS回购完成这一点,并将防止您的去这些私有模块的命令由于校验和不匹配而失败。
在此配置中,您可以确保对私有模块的引用不会“泄露”,同时还强制公共和私有模块的不可变性和可用性。
割断绳结
如您所见,使用私有GOPROXY提供了最大的确定性、可靠性和安全性。
您还可以通过私有GOPROXY与构建工具之间的网络接近度来加快模块依赖关系的解析。JFrog Artifactory可以安装在您最需要的地方:本地或云中,或在所有三个主要的公共云提供商上作为SaaS订阅。
这些好处也不仅仅局限于Go的开发。大多数技术公司使用不止一种语言和多个包管理器。例如,如果代码是用Golang编写的,那么npm可能用于UI, Docker可能用于分发比特,Helm可能用于在k8上部署应用程序。
通过对超过27种包类型的支持,Artifactory可以为所有应用程序提供确定的、稳定的和安全的软件开发过程。您可以获得免费试用,并了解Artifactory如何指导您的线路并使您的软件自由运行。
