前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >为什么应该使用 Go module proxy

为什么应该使用 Go module proxy

作者头像
凌虚
发布于 2020-07-20 03:55:55
发布于 2020-07-20 03:55:55
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

自从 Go v1.11 版本之后 Go modules 成了官方的包管理方式,与此同时还有一个 Go module proxy ,它到底是个什么东西?顾名思义,其实就是个代理,所有的模块和依赖库都可以从这个代理上下载。

Go module proxy 到底有何特别之处?我们为什么应该使用它?

使用 Go modules ,如果你添加了新的依赖项或者构建了自己的模块,那么它将会基于 go.mod 文件下载( go get )所有的依赖项并且缓存起来。你可以使用 vendor 目录(将依赖项置于此目录下)以绕过缓存,同时通过 -mod=vendor 标记就可以指定使用 vendor 目录下的依赖项进行构建。然而这么做并不好。

01

使用 vendor 目录有哪些问题:

  • vendor 目录不再是 go 命令的默认项,你必须通过 -mode=vendor 指定。
  • vendor 目录占用了太多的空间,克隆时也会花费大量时间,尤其是 CI/CD 的效率很低。
  • vendor 更新依赖项很难 review ,而依赖项又常常与业务逻辑紧密关联,我们很难去回顾到底发生了哪些变化。

那么不使用 vendor 目录又会如何呢?这时我们又将面临如下问题:

  • go 将尝试从源库下载依赖项,但是源库存在被删除的风险。
  • VCS(版本控制系统,如 github.com)可能会挂掉或无法使用,这时你也无法构建你的项目。
  • 有些公司的内部网络对外隔离,不使用 vendor 目录对他们来说也不行。
  • 依赖库的所有者可能通过推送相同版本的恶意内容进行破坏。要防止这种情况发生,需要将 go.sum 和 go.mod 文件一起存储。
  • 某些依赖项可能会使用与 git 不同的 VCS ,如 hg(Mercurial)、bzr(Bazaar)、svn(Subversion),因此你不得不安装这些其他的工具,很烦。
  • go get 需要获取 go.mod 中每个依赖项的源代码以解决传递依赖,这显著减慢了整个构建过程,因为它必须下载(git clone)每个存储库以获取单个文件。

如何解决上述这一系列的问题?答案是使用 Go module proxy 。

02

默认情况下,go 命令直接从 VCS 下载模块。环境变量 GOPROXY 指定使用 Go module proxy 以进一步控制下载源。

通过设置 GOPROXY ,你将会解决上述的所有问题:

  • Go module proxy 默认缓存并永久存储所有依赖项(不可变存储),你不再需要 vendor 目录。
  • 摆脱了 vendor 目录意味着项目不再占用 repository 空间,提高了效率。
  • 由于依赖库以不可变的形式存储在代理中,即使源库删除,代理中的库也不会被删除,这保障依赖库的使用者。
  • 一旦模块被存储在 Go proxy 中,就无法被覆盖或者删除,换句话说使用相同版本注入恶意代码的行为攻击将不再奏效。
  • 你不再需要任何 VCS 工具来下载依赖项,因为你只需要通过 http 与 Go proxy 建立连接。
  • 下载和构建将会快很多,官方团队测试的结果是快了三到六倍。
  • 你可以轻松管理自己的代理,这可以让你更好的控制构建管道的稳定性。

综上所述,你绝对应该使用 Go module proxy 。

03

如何使用 Go module proxy ?

你需要设置环境变量 GOPROXY :

1、如果 GOPROXY 未设置、为空、或者设置为 direct ,则 go get 将直连 VCS (如 github.com):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GOPROXY=""
GOPROXY=direct

如果设置为 off ,则表示不允许使用网络:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GOPROXY=off

2、你可以使用任意一个公共的代理 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GOPROXY=https://proxy.golang.org # 谷歌官方,大陆地区被墙了
GOPROXY=https://goproxy.io # 个人开源
GOPROXY=https://goproxy.cn # 大陆地区建议使用,七牛云托管

3、你可以基于开源方案实现本地部署:

  • Athens: https://github.com/gomods/athens
  • goproxy: https://github.com/goproxy/goproxy
  • THUMBAI: https://thumbai.app/

通过这种方式你可以构建一个公司的内部代理,与外网隔离。

4、你可以购买商业产品:

  • Artifactory: https://jfrog.com/artifactory/

5、你可以使用 file:/// URL ,文件系统路径也是可以直接使用的。

04

Go v1.13 版本的相关更改:

  • GOPROXY 可以设置为以逗号分隔的列表,如果某个地址失败将会依次尝试后面的地址。
  • GOPROXY 默认启动,默认值将会是 https://proxy.golang.org,direct 。direct 之后的地址将会被忽略。
  • GOPRIVATE 环境变量将会被推出,用于绕过 GOPROXY 中的特定路径,尤其是公司中的私有模块。

05

相关资料:

https://github.com/golang/go/wiki/Modules

https://proxy.golang.org/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Node Python Go全栈开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go的包管理工具(四):Go Module Proxy
在前面的文章,我们介绍了Go Modules。Go module支持了Versioned Go,并初步解决了包依赖管理的问题。
aoho求索
2019/05/07
2.1K0
Go的包管理工具(四):Go Module Proxy
Go依赖模块版本之Module避坑使用详解
对于Go的版本管理主要用过 glide,下面介绍 Go 1.11 之后官方支持的版本管理工具 mod。
sunsky
2020/08/20
4.6K0
Go Modules:Go语言依赖管理的新篇章
自从Go 1.11版本引入以来,Go Modules 已经成为了Go语言依赖管理的标准。接下来,我将用简单易懂的语言,带你一步步了解Go Modules的安装、使用和最佳实践。
南山竹
2024/06/06
4040
Go Modules:Go语言依赖管理的新篇章
[Golang]包管理
本文是本人在探索 Go 最新的包管理 Go Modules 的一些总结,希望能够更深入了解 Go 最新的包管理方式,以及在实际环境中将它很好的使用起来。
别打名名
2020/07/28
1.7K0
Go Modules知识点总结
起初Go语言在1.5之前没有依赖管理工具,若想引入依赖库,需要执行go get命令将代码拉取放入GOPATH/src目录下,作为GOPATH下的全局依赖,这也就意味着没有版本控制及隔离项目的包依赖;
Golang梦工厂
2023/02/26
8470
Go Modules知识点总结
Go Modules 终极入门
Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go 官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。
madneal
2020/03/10
1.9K0
Go Modules 终极入门
Go语言技巧 - 5.【初探Go Module】Go语言的版本管理
Go语言自从推出了go mod作为版本管理工具后,结束Go语言版本管理工具的纷争,实现了大一统。
junedayday
2021/08/05
9380
Golang 1.16 中 Module 有什么变化?
golang 1.16 默认开启 Modules,即使不存在 go.mod,Go 命令现在默认情况下也会在 module-aware(模块感知)模式下构建包。
frank.
2021/03/09
2K0
Golang Module的使用 顶
注意:go mod 还有一些其他比较有意思的工具,比如可以打印依赖树,比如可以查看哪些模块在哪些包引用了
BGBiao
2019/09/09
1.3K0
Go Module详细使用教程,包管理不在难
go modules是 golang 1.11引入的新特性。模块是相关Go包的集合。modules是源代码交换和版本控制的单元。go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
公号:咻咻ing
2020/03/04
20.5K0
干货满满的 Go Modules 和 goproxy.cn
大家好,我是一只普通的煎鱼,周四晚上很有幸邀请到 goproxy.cn 的作者 @盛傲飞(@aofei) 到 Go 夜读给我们进行第 61 期 《Go Modules、Go Module Proxy 和 goproxy.cn》的技术分享。
madneal
2019/11/28
1.3K0
GO 依赖管理工具go Modules(官方推荐)
以前写过一篇关于go管理依赖包工具 dep的文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是“official experiment”官方实验项目的那样,随着go modules 在go1.11版推出,go1.12版功能不断改进,再到go1.13版完善优化,正式扶正。预计dep将来也只能定格在“official experiment”了。
孤烟
2020/09/27
1.8K1
Go的包管理工具(三):Go Modules
在前面的文章,我们先是介绍了Go 的几种包管理方式,然后具体介绍了一种包管理的工具:glide。随着 Go 1.11 的发布,官方的包管理工具 Go Modules 变得流行起来。在发布不久的 Go 1.12 版本中,增强了对 Go Modules 的支持。本文将会介绍如何在项目中安装和使用 Go Modules 。
aoho求索
2019/05/07
1.5K0
Go 语言开发环境搭建
如果提示没有权限,加上sudo以root用户的身份再运行。执行完就可以在/usr/local/下看到go目录了。
贾维斯Echo
2023/10/18
7250
Go 语言开发环境搭建
GoCenter助力Golang全速前进
Go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。为了方便搜索和识别,有时会将其称为Golang。自2009年11月Google正式宣布推出,成为开放源代码项目以来,Go语言已成为当今开发人员和DevOps领域最流行的语言之一, 它被用于设计和编写Kubernetes和Helm。但是,相比语言本身已经得到了广泛的普及和使用,Go语言的包管理方案却大大滞后了。
JFrog杰蛙科技
2020/01/08
1.2K0
GoCenter助力Golang全速前进
GoLang 新版包管理 -- go module 的使用
上一篇文章中,我们介绍了 GoLang 中包的使用与包管理机制。 GoLang 包的使用与管理
用户3147702
2022/06/27
2.4K0
GoLang 新版包管理 -- go module 的使用
【初识Go】| Day9 包管理
现在随便一个小程序的实现都可能包含超过10000个函数。然而作者一般只需要考虑其中很小的一部分和做很少的设计,因为绝大部分代码都是由他人编写的,它们通过类似包或模块的方式被重用。
yussuy
2020/12/23
4870
【初识Go】| Day9 包管理
go mod使用
最近由于换工作,开始交接工作。整理以前的工作内容,由于组内就我一个在做go和大数据。 所以开发没有规划,当时是怎么快怎么来。go也是使用最传统的go path的方式管理的。都是手动管理依赖的。现在交接给他人,需要多人开发,发现很多问题。比如版本问题,各种依赖的问题等等。
若与
2020/05/18
1.6K0
Go语言笔记----GoMoudle
将你的包或者别人的包全部放在 $GOPATH/src 目录下进行管理的方式,我们称之为 GOPATH 模式。
大忽悠爱学习
2022/05/10
6000
Go语言笔记----GoMoudle
Go modules基础精进,六大核心概念全解析(下)
在上篇中,我们介绍了模块路径、版本号与兼容性原则、伪版本号三大概念,而在下篇我们将会继续介绍Go Modules核心概念。
Bain
2021/12/06
7140
Go modules基础精进,六大核心概念全解析(下)
相关推荐
Go的包管理工具(四):Go Module Proxy
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验