在看过 Go module
的简介之后,我以为我已经知道了这个功能我需要知道的一切。但是很快,我意识到并不是这样。最近,人们开始提倡使用 Go module proxy
。在研究了利弊之后,我得出结论,这将是近年来 Go 语言 最重要
的变化之一。但为什么会这样呢?是什么让 Go module
代理如此特别?
使用 Go modules
时,如果向干净的缓存的计算机上添加新依赖项或构建 Go module
,它将基于 go.mod
将下载(go get)所有依赖项,并将其缓存以供进一步操作。你也可以使用 -mod=vendor
参数构建 vendor
文件夹,来绕过缓存,以及后边使用这些下载的依赖。
但以上两种方法都不完美,我们应该可以做得更好。
go
命令,默认不再使用 vendor
文件夹。如果你不附加 -mod=vendor
参数,这个文件夹将不会被启用。这通常引发问题,并导致必须使用其他陈旧的方案来支持老 Go 版本程序(请参考:在 Travis CI 上使用 Go Module 和 vendor[2])vendor
文件夹,会占用大量磁盘空间,特别是在比较大的单体应用中。这也将增加代码仓库的克隆时间。可能你认为只用克隆一次,实际却不是这样。CI/CD 在每次事件(比如:pull request
)都会触发克隆代码。因此,这将长期导致更长的编译时间,并将影响团队中的每个人。go
程序将去源码仓库下载这些依赖。总是存在任何依赖可能在将来消失的风险(记住左边的传奇故事[3])。github.com
)可能关闭。在这种情况下,你将无法再次构建项目。vendor
文件夹,我们将无法使用。tag
是 v1.3.0
,并且已经 go get
获取它到本地缓存。此时,依赖的所有者可以通过推送具有相同 tag
的恶意内容来破坏代码库。如果在具有干净缓存的计算机上重建 Go module
,它现在将使用被破坏的包。为了防止这种情况,需要将 go.sum
和 go.mod
文件放在一起 。git
作为 版本管理系统
,还有可能使用 hg(Mercurial)
,bzr(Bazaar
) 或 svn(Subversion)
。而你的机器没有安装装或者 Dockerfile 没有配置这些工具,这都将引发问题。go get
需要获取 go.mod
列出的每个依赖项的源代码来解决递归依赖(需相应的 go.mod
文件)。因为它意味着必须下载(例如 git clone
)每个存储库以获取单个文件[4],这显然会使得整个构建过程变慢。那我们怎么解决这些问题呢?
默认情况下, go
命令会直接从版本管理系统下载代码。GOPROXY
环境变量允许在下载源的进一步控制。配置该环境变量后,go
命令可以使用 Go module proxy
。
设置环境变量 GOPROXY
开启 Go module proxy
后,将解决上边提到的所有问题。
Go module proxy
默认永久缓存所有依赖(不可变存储)。这意味着,不必再使用 vendor 文件夹。vendor
文件夹,它将不会再消耗代码库的空间。不可变存储
中,即使依赖项从网上消失,你的代码也会受到保护。Go module
(依赖) 存储在 Go proxy
中,就无法覆盖或删除它。这可以保护你免受可能使用相同版本注入恶意代码的攻击。Go proxy
在后台使用 HTTP)。Go module
的速度要快得多,因为 Go proxy
通过 HTTP 独立提供源代码(.zip
存档)go.mod
。与从 VCS 获取相比,由于更少的开销,这使得下载花费更少的时间。相比之前它必须获取整个存储库,解决依赖关系也更快,因为 go.mod
可以独立获取。Go 官方团队对它进行了测试,他们看到快速网络上的速度提高了 3 倍,而慢速网络则提高了 6 倍!Go proxy
,这可以让你更好地控制构建管道的稳定性,并防止 VCS 关闭时的罕见情况。如你所见,使用 Go module proxy
对人人都有好处。但是我们如何使用它呢?如果你不想维护自己的 Go module proxy
怎么办?这里还有许多替代方案。
要开始使用 Go module proxy
,我们需要将 GOPROXY
环境变量设置为兼容的 Go module proxy
。这有多种方式:
1 . 如果没有设置 GOPROXY
,将其设置为空或设置为 direct
,然后 go get
将直接到 VCS
(例如 github.com
)拉取代码:
GOPROXY=""
GOPROXY=direct
GOPROXY
也可以设置为 off
,这意味着不允许使用网络
GOPROXY=off
2 . 你可以开始使用公共 GOPROXY
。你也可以选择使用 Go 官方团队的 GOPROXY
(由 Google 运营)。更多信息可以在这里找到:https://proxy.golang.org/
要开始使用它,你只需设置环境变量:
GOPROXY=https://proxy.golang.org
其他可用的公共代理:
GOPROXY=https://goproxy.io
GOPROXY=https://goproxy.cn # proxy.golang.org 被墙了, 这个没有
3 . 你可以运行多个开源实现并自己托管。可用的有:
你既可以自己维护,也可以通过公共互联网或内部网络获取相关服务,看你自己的决定。
a . Athens
:https://github.com/gomods/athens
b . goproxy
:https://github.com/goproxy/goproxy
c . THUMBAI
:https://thumbai.app/
4 . 你可以购买商业产品:
Artifactory
: https://jfrog.com/artifactory/
5 . 你可以传入 file:///
路由。因为 Go module proxy
是响应 GET 请求(没有查询参数)的 Web 服务器,所以任何文件系统中的文件夹都可以用作 Go module proxy
。
在 Go v1.13 版本中, Go proxy
会有一些变化,我认为应该强调一下:
GOPROXY
环境变量现在可以设置为逗号分隔的列表。它会在回到下一个路径之前尝试第一个代理。GOPROXY
的默认值为 https://proxy.golang.org,direct。设置 direct
后将忽略之后的所有内容。这也意味着 go get
现在将默认使用 GOPROXY
。如果你根本不想使用 GOPROXY
,则需要将其设置为 off
。GOPRIVATE
,它包含以逗号分隔的 全局列表。这可用于绕过 GOPROXY
某些路径的代理,尤其是公司中的私有模块(例如: GOPRIVATE=*.internal.company.com
)。所有这些变化都表明 Go module proxy
将是 Go module
的核心和重要组成。
无论使用公共网络,还是专用网络,GOPROXY
都有很多优势。这是一个很棒的工具,它可以和 go
命令无缝协作。鉴于它具有如此多的优势(安全,快速,存储高效),明智的做法是在您的项目或组织中快速接受它。此外,在 Go v1.13
版本中,默认情况下会启用它,这是另一个受欢迎的步骤,它改善了 Go 中依赖项管理的现状。
[1]模块感知模式: https://golang.org/cmd/go/#hdr-Modules_and_vendoring
[2]在 Travis CI 上使用 Go Module 和 vendor: https://arslan.io/2018/08/26/using-go-modules-with-vendor-support-on-travis-ci/
[3]记住左边的传奇故事: https://qz.com/646467/how-one-programmer-broke-the-internet-by-deleting-a-tiny-piece-of-code/
[4]获取单个文件: https://about.sourcegraph.com/go/gophercon-2019-go-module-proxy-life-of-a-query
[5]Fatih Arslan: https://arslan.io/
[6]TomatoAres: https://github.com/TomatoAres
[7]polaris1119: https://github.com/polaris1119
[8]GCTT: https://github.com/studygolang/GCTT
[9]Go 中文网: https://studygolang.com/
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/4AT-5LVU-VAlmtqAzYc7XA
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。