热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Go语言的包和依赖管理

这篇文章的知识点包括:golang的简介、golang的依赖管理、golang的包管理以及GoCenter的使用,阅读完整文相信大家对Go语言的包和依赖管理有了一

这篇文章的知识点包括:golang的简介、golang的依赖管理、golang的包管理以及GoCenter的使用,阅读完整文相信大家对Go语言的包和依赖管理有了一定的认识。

一、背景

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语言的包和依赖管理

开发人员也可以提交自己的Go项目加入GoCenter,以便将其提供给Go社区开发者,从而得到更为广泛地应用。
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/issues/26334)。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将列出与搜索名称匹配或部分匹配的模块。
    Go语言的包和依赖管理

点击列表中的某个模块,将会列出GoCenter中该模块的所有版本:
Go语言的包和依赖管理

列出的版本都利用颜色编码来指示其当前的可用状态:
绿色,表示该模块版本已在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颗星

看完上述内容,你们对Go语言的包和依赖管理有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程笔记行业资讯频道,感谢各位的阅读。


推荐阅读
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • php支持中文文件名
    2019独角兽企业重金招聘Python工程师标准大家可能遇到过上传中文文件名的文件,或者读取中文目录时不能读取,出现错误的情况这种情况是因为php自动将中文字符转成了utf8 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
author-avatar
罗文彬2502852027
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有