共计 5684 个字符,预计需要花费 15 分钟才能阅读完成。
一、背景
Go 语言是 Google 开发的一种动态强类型、编译型、并发型,并具备垃圾回收性能的编程语言。为了不便搜寻和辨认,有时会将其称为 Golang。自 2009 年 11 月 Google 正式发表推出,成为凋谢源代码我的项目以来,Go 语言已成为当今开发人员和 DevOps 畛域最风行的语言之一, 它被用于设计和编写 Kubernetes 和 Helm。然而,相比语言自身曾经失去了宽泛的遍及和应用,Go 语言的包治理计划却大大滞后了。
Go 语言生态系统中短少的是标准化——没有用于依赖关系治理的规范工具, 也没有规范的包格局或兼容的包仓库标准。这意味着开发人员无奈应用 Go 语言创立可重现的构建, 这是一个相当大的问题。这些年来, 社区推出了诸如 dep、godep、glide 和 govender 等工具,试图用来解决 Go 语言的依赖治理, 但并未胜利。2018 年 Google 在 Go1.11 官网推出了 Go modules,为 Go 语言提供了反对版本化的依赖治理计划。
Go modules 当初已成为 Go 语言规范的依赖管理工具和包仓库标准。而 GoCenter 为 Go modules 的实现和推广提供了依赖包的公共仓库,使得 Go 语言的开发人员可能更为稳固和不便地开发可反复构建的 Go 应用程序。
二、Go 语言的依赖治理
在介绍 GoCenter 之前,咱们先简要地回顾一下 Go 语言依赖治理的倒退历程。
Go 语言在推出之初,并没有明确的依赖治理计划。只是在构建过程中通过 go get 命令,将用 import 申明的依赖从对应的源,通常是 git 上的我的项目,下载到 $GOPATH/src 目录下,和 Go 利用本身的代码放在一起。这种依附 GOPATH 来治理依赖的机制带来的问题 是不言而喻的,比方:
· 因源依赖包本身的变动,导致不同工夫构建 Go 利用时 go get 失去的依赖本质上是不同的,即不能实现可反复的构建;
· 或者因源依赖包本身的变动,从新构建 Go 利用时会引入不兼容的新实现,导致 Go 利用无奈通过编译。
因而在 1.5 版本以前,为了躲避这个问题,通常须要将应用的依赖包手工拷贝进去。
为了实现 Go 利用的可反复构建,Go1.5 引入了 Vendor 机制。Vendor 机制的外围就是在 GOPATH 上面减少了 vendor 文件夹。Go 利用所需的依赖都能够从依赖源 fork 出所需的分支,寄存到 vendor 文件夹。当构建 Go 利用时,Go 编译器会优先在 vendor 文件夹下搜寻依赖的第三方包,vendor 文件夹下没有才会再到 $GOPATH/src 上来找。这样只有开发者事后将特定版本的依赖包寄存在 vendor 文件夹,并提交到 Go 我的项目的 code repo,那么所有人实践上都会失去同样的编译后果,从而实现可反复构建。在 Go1.5 公布后的若干年,Go 社区把注意力都集中在如何利用 Vendor 机制解决 Go 利用的依赖治理问题,并诞生了泛滥的依赖管理工具,如 dep、golide、govendor 等。然而,和 Java 的 Maven、Python 的 Pypi、C/C++ 的 Conan 等业界成熟的依赖治理计划相比,Vender 机制依然存在许多问题,比方:
· Vendor 文件夹中的依赖包没有版本信息。这样依赖包脱离了版本治理,对于一致性治理、降级,以及问题追溯等场景,都会难以解决;
· Vendor 机制没有给出如何可能不便地失去 Go 我的项目依赖了哪些包,并将其拷贝到 vendor 文件夹下的计划,少数状况下还须要到不同的 Git 源我的项目里手工拷贝;
· 当依赖的包比拟多的时候,vendor 文件夹也会变得十分宏大。
2018 年年初,Go 外围 Team 的技术 leader,也是 Go Team 最晚期成员之一的 Russ Cox 在集体博客上间断发表了七篇文章,系统阐述了 Go team 解决“包依赖治理”的技术计划:vgo。vgo 的次要思路包含:语义导入版本控制(Semantic Import Versioning)、最小版本抉择(Minimal Version Selection)、以及引入 Go module 等。同年 5 月份,Russ Cox 的提案“cmd/go: add package version support to Go toolchain”被社区承受,vgo 的代码合并到 Go 骨干,并将这套机制正式命名为“go modules”。因为 vgo 我的项目自身就是一个试验原型,merge 到骨干后,vgo 这个术语以及 vgo 我的项目的使命也就此结束了。后续 Go modules 机制将间接在 Go 骨干上持续演变。
Go modules 机制的次要变动包含:
· 去除了饱受诟病的 GOPATH 的限度。Go 编译器将不再到 GOPATH 上面的 vendor 或 src 文件夹下搜寻 Go 利用构建依赖的第三方包;
· Go modules 机制为在同一利用 repo 上面的包赋予了一个新的抽象概念: 模块(module),即可重用的 Go 代码包,并启用一个新的文件 go.mod 记录模块的元信息和依赖关系。而在 go.mod 里明确形容了依赖包的版本信息,同一个依赖包也能够记录多个不同的版本。除了准确版本外,go.mod 还反对用表达式模糊地定义依赖版本;
· 在 Go modules 机制下,还反对创立 Go 依赖包的公共仓库。这是因为应用程序蕴含的 Go 模块,必须从数千个独立的源代码存储库中解析, 而每个存储库的保护纪律可能各不相同。因而, 须要存在一个可公开拜访的存储库,通过 Go modules 提供的依赖形容、解析机制,为 Go 的开发者提供统一的、可分享的、反对反复构建的、稳固的 Go 依赖包源。GoCenter 就是这种 Go 依赖包公共仓库的重要实现。
三、GoCenter 简介
GoCenter 通过创立 Go 模块的公共地方仓库,提供可反复和疾速依赖解析的依赖包治理计划,解决了 Go 开发人员查找和获取 Go 依赖包的艰难。GoCenter 将间接从源代码存储库获取 Go 我的项目,转变为解决和验证不可变的、具备版本控制的 Go 模块, 并将其收费提供给 Go 利用的开发人员。
GoCenter(https://gocenter.io)提供了通过公共 Go 代理解析模块, 包含通过托管收费服务搜寻模块的能力。从创立开始, GoCenter 曾经包含了数千个广受欢迎的 Go 我的项目的模块, Go 开发者能够立刻应用这些我的项目进行本人的构建。
开发人员也能够提交本人的 Go 我的项目退出 GoCenter,以便将其提供给 Go 社区开发者,从而失去更为宽泛地利用。
GoCenter 这个地方仓库,提供了事后打包,以及版本化的 Go 模块,使得 Go 开发人员或团队不再须要为应用公共模块而构建本人的模块库,从而消减了应用 Go 语言的微小老本。
此外,如果 Go 开发者或团队曾经有了本人的 JFrog Artifactory 仓库,就能够通过配置指向 GoCenter 的近程仓库,为反复构建提供齐全的本地化管制,并能够预防拜访 GoCenter 的网络连接问题。
四、基于 GoCenter 构建 Go 利用
要构建 Go 利用我的项目,首先须要装置 Go 客户端 (版本 1.11.0 或更新的版本)。而装置 Go 之后,有三种办法能够从 GoCenter 解析 Go 模块:应用 goc、应用 go 客户端,或部署本地仓库(如 Artifactory),以代理 GoCenter。
1、应用 goc
举荐在构建中应用 GoCenter 的形式是通过 goc 工具。goc 工具包装了 Go 的客户端,器, 可能应用 GoCenter 中的包正确构建 Go 利用,而无需手动设置。
要装置 goc,须要应用以下的 curl 命令,或依照 goc 的 github 主页(https://github.com/jfrog/goc)的阐明:
$ curl -fL https://getgoc.gocenter.io | sh
而后, 就能够从 Go 我的项目的根目录中运行任何命令, 就像运行 Go 命令一样。例如:
$ goc build
goc 工具主动调配 GOPROXY 连贯 GoCenter,所以可能优先从该仓库解析 Go 的依赖包。对于在 GoCenter 找不到的包,goc 将会试图通过源代码控制系统来解析它们,以更好地保障胜利构建 Go 我的项目。
Go 客户端本身不能执行这种辅助操作(请参阅下文),因而至多在 GoCenter 可能为大多数 Go 开发人员提供可能须要的所有依赖之前,依然倡议应用 goc。
2、应用 Go 客户端
举荐在构建中应用 GoCenter 的形式是通过 goc 工具。goc 工具包装了 Go 的客户端,器, 可能应用 GoCenter 中的包正确构建 Go 利用,而无需手动设置。
如上所述,应用 GoCenter 时并不倡议间接利用 Go 客户端进行构建,因为当在 GoCenter 找不到相干依赖包时构建会失败。对于 Go 客户端这种限度的详细信息,能够参考相干的 issue 和修改信息(https://github.com/golang/go/…)。Go 开发人员还是应该改用 goc。
当然,如果在充沛理解这个限度还心愿应用的状况下,也是能够应用 Go 客户端的。
如果心愿构建 Go 我的项目时从 GoCenter 中获取相干依赖包,须要设置 GOPROXY 指向 GoCenter 的 URL,https://gocenter.io:
$ export GOPROXY=https://gocenter.io
当初就能够应用 Go 客户端构建 Go 利用了:
$ go build
3、部署代理 GoCenter 的公有仓库
如果应用的是如 Artifactory 这样的公有仓库,则只需设置 GOPROXY 指向该公有仓库,而把 GoCenter 创立为该公有仓库当中的近程仓库。
为了要在 Artifactory 里创立代理 GoCenter 的近程仓库,须要遵循以下步骤:
1. 创立新的近程仓库,并设置包类型为 Go;
2. 设置近程仓库的名字,并在 URL 字段输出 https://gocenter.io/;
3. 点击“保留 & 实现”按键。
还能够创立虚构仓库,用以聚合同时从本地 Go 仓库和近程仓库获取的 Go 依赖包。
一旦在 Artifactory 里配置好应用 GoCenter,就能够应用规范的 GOPROXY 形式基于 Artifactory 进行构建。须要留神的是,依据 Artifacotry 上的设置,须要适当地解决客户端的认证信息,应为以后 Go 客户端在获取模块时是不会发送相干认证信息的,所以解决起来是有肯定难度的。因而,当应用 Artifactory 代理 GoCenter 时,倡议应用 JFrog CLI 来构建 Go 利用。当配置好 JFrog CLI 和 Artifactory 的关联之后,就能够应用相似于
“jfrog rt go build”的命令来从 Artifactory 获取依赖,并构建 Go 利用。
应用 JFrog CLI 的益处是能够不便地向 Artifactory 上传针对特定构建而创立的依赖包,也同时内置反对生成和公布与构建过程相干的元数据。详细信息,请参考 JFrog CLI 的相干文档。
五、搜寻 Go 模块
GoCenter 首页中的搜寻框可帮忙按特定模块名称(例如, “ 虹膜 ”)进行搜寻。当执行搜寻时,GoCenter 将列出与搜寻名称匹配或局部匹配的模块。
点击列表中的某个模块,将会列出 GoCenter 中该模块的所有版本:
列出的版本都利用色彩编码来批示其以后的可用状态:
绿色 ,示意该模块版本已在 GoCenter 之中且处于可用状态;
红色 ,示意该模块版本不存在,而且不可用;
灰色 ,示意该模块版本正在引入的过程中,尚未可用。
搜寻后果还会显示那些 Go 我的项目在相干 Git 代码库存在,而在 GoCenter 尚不存在的模块版本列表。如果有这样的缺失版本,能够通过单击“Add missing version(s)”把它们 增加到 GoCenter。
六、提交本人的 Go 模块
如果心愿将本人的 Go 我的项目增加到 GoCenter,使其可被 Go 社区的开发人员应用,则须要提交相干的退出申请。
首先能够对心愿退出的模块名执行搜寻。如果相干模块并不存在,则能够单击“Add”图标来申请增加模块。一旦点击,将会看到退出申请表格。在表格中,能够输出申请加入的 Go 模块的 URL。通过搜寻该模块的后果能够查看该模块的退出进度。
GoCenter 将根据以下最低标准来验证退出申请:
· Go 模块位于 gihub.com 或 gopkg.in 上的公共我的项目(repo);
· 该我的项目没有被设置为存档状态(archived);
· 该我的项目至多领有 3 颗星
七、总结
自从 2007 年首次在谷歌构想,并于 2009 年正式推出,Go 语言很快就成为最风行的编程语言之一。事实上,Helm 和 Kubernetes 都是用 Go 语言编写的。在 2017 年的一项考察中,Go 语言在开发者的偏好中排名最高,67% 的开发者都在利用 Go 语言编程。
为此, 咱们冀望 GoCenter 可能为一直增长的 Go 社区和开发人员提供必要的服务,并帮忙 Go 语言更加合乎 DevOps 的需要。
通过拜访 GoCenter,https://gocenter.io,能够发现常常应用的 Go 依赖包都曾经蕴含在其中了。如果还没有,请提交相干的退出申请。
GoCenter 治理了版本化的 Go 模块,能够和 Go 利用构建应用的任何 CI 服务器或公有仓库进行对接。而应用 JFrog CLI 和 Artifactory,能够使得这一过程更加便捷。
想要理解无关 GoCenter 更多深刻的技术信息?请查看 GoCenter 的 Github 我的项目,https://github.com/jfrog/gocenter。
八、参考文献
Golang:https://golang.org
Go & Versioning: https://research.swtch.com/vgo
GoCenter:https://gocenter.io/
https://github.com/jfrog/gocenter。
goc: https://github.com/jfrog/goc
JFrog CLI:https://www.jfrog.com/confluence/display/CLI/CLI+for+JFrog+Artifactory
** 欢送观看 JFrog 杰蛙每周二在线课堂,点击报名:
https://www.bagevent.com/even…**