您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

10分钟将你的Go工程转换为Go Module模式

时间:2020-03-05 10:21:21  来源:  作者:

自从在Go 1.11和更高版本中引入了Go的新的依赖管理系统以来,GoLang开发人员已经接受了包版本控制解决方案。这样做的用户可以使用GoCenter存储库中的 不可变 公共Go 模块,并通过更健壮、更可靠的Go Pipeline获得更快的构建速度。

但是,将现有的项目转换为使用Go Module并不总是很容易,尤其是如果该项目已经尝试过GoLang的其他包管理解决方案时。

为了帮助GoLang社区正确地使用Go Module,我们将使用开源的etcd项目(Kubernetes使用的键值数据存储)作为示例。这是一个最佳实践的实际示例,因为它足够复杂,可以展示一些常见的实践

 

Go 项目依赖管理痛点分析

传统GO项目进行第三方模块依赖时,往往是去下载第三方源码,这种方式将存在以下常见问题:

  1. 性能及稳定性:每次下载从各大VCS系统下载源码性能低,依赖网络环境,稳定性差
  2. 一致性&可重复性:容易收到依赖源的影响,我们往往在感知不到模块提供方的改动时,就下载了新版的代码,两次依赖某模块得到的依赖不一致,往往造成前一秒还行,下一秒构建失败的情形,尤其在持续集成系统中
  3. 协作:源码方式模块基本无版本概念,或不是语义类型,多团队协作困难

基于以上问题及痛点,建议转换为Go Module 模式管理Go 项目依赖。附Go Module 基于Go Proxy进行依赖下载的原理图:

10分钟将你的Go工程转换为Go Module模式

 

应用Go Module方式后可以获得以下收益:

  1. 可用性(标签tag可以从VCS中删除)
  2. 不变性(可以在VCS中进行更改)
  3. 快速:(没有git克隆,没有计算元数据,调用更少,性能好)
  4. 本地统一存储缓存($GOPATH/pkg /mod/cache)

Go模块转换最佳实践

我们以ETCD项目为例进行转换,这个转换过程已通过测试用例的验证,可以到该项目中的 Pull Request 中查看

步骤一:准备go.mod文件

对于以前从未使用过模块的项目(没有go.mod 文件),或者任何现在不推荐的依赖项管理解决方案,这个过程都非常简单。您只需要在项目的根目录中运行go mod tidy。这将生成一个新的、已填充好该项目依赖描述的go.mod文件。

但是,如果项目使用了那些较老的解决方案之一,比如dep、glide、govendor或godep,那么您将需要运行go mod init来生成填充的go.mod文件。该命令支持旧格式中依赖项描述。

etcd项目确实有一个go.mod文件,尽管它从未在项目的构建系统中启用。问题是模块名称没有正确的版本标识符,因为当前版本标记是v2+。由于 语义化导入版本控制 的影响,需要更改为v3。

其包括执行以下过程:

1. 更新etcd的go.mod文件以修正模块名称,使其包含v3后缀。

10分钟将你的Go工程转换为Go Module模式

 

2. 更新所有代码中的Import以包含版本号。我们编写了一个脚本,以便更容易地修改所有引用。完成后,此更改如下:

10分钟将你的Go工程转换为Go Module模式

 

步骤二 : 启用Go模块

要使go客户端能够使用go module,需要设置GO111MODULE=on

正如我们所指出的,etcd项目已经设置了go.mod文件,有人可能认为这已经完成了。但它没有,而该环境变量这种缺失证实了该项目还没有使用go module。

注意:从Go 1.13开始,这一步将不再需要,因为Go Module将在默认情况下启用

步骤三 : 更新测试中的导入

在上面的过程中,我们对组成etcd主模块的go.mod文件进行了更新,以使用v3版本标记。现在主模块被标记为v3,我们还需要更新etcd项目的测试用例中的Import引用v3,以确保它们导入了主模块的正确版本。

步骤四 : 其他更新

在这些更改之后,您可能希望保持良好的状态—毕竟,应用程序模块现在已经全部转换为使用go module,并使用正确的版本标记。

不过没那么快。一旦你开始运行测试,你会发现两个额外的场景需要处理:

1. etcd使用了诸如golint、gosimple、staticcheck、ineffassign等静态分析工具,但其中一些工具没有模块意识,无法识别模块路径,而无法通过必要的检查。在etcd的这种场景下,etcd-io/etcd下并没有v3文件夹,但是Import导入(或模块路径)包含v3,如etcd-io/etcd/v3。其他工具是模块感知的,但必须在新版本的Go 12中可用。如果构建系统在11之上,那么它们也需要迁移到12。

2. 如果使用了protobuf之类的代码生成器。更新.proto文件,以便使用正确版本的导入生成代码。

步骤五 : 加入GoCenter

在构建过程中,您可能会注意到许多go get命令在etcd的不同阶段执行。

为了加快GoLang应用程序的构建时间,并确保etcd ppipeline中使用的Go Module版本的不可变性和可用性,使用GoCenter来构建etcd

只需设置GOPROXY=https://gocenter.io。(详细原理可看上文的Go Proxy 原理图)

总结

正如您所看到的,将Go项目转换为使用Go Module方式非常简单,但是有一些细节可能会减慢您的速度。通过选择这个具有丰富场景的项目来演示这个过程,我们相信我们达到了大多数需要处理的场景,为您提供了一个很好的示例,覆盖了您可能面临的情况。



Tags:Go Module   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
自从在Go 1.11和更高版本中引入了Go的新的依赖管理系统以来,GoLang开发人员已经接受了包版本控制解决方案。这样做的用户可以使用GoCenter存储库中的 不可变 公共Go 模块,并通...【详细内容】
2020-03-05  Tags: Go Module  点击:(32)  评论:(0)  加入收藏
1 速览在正式了解Golang Modules之前,我们先速览一下其使用方式。在$GOPATH之外的任意地方,创建一个文件夹:$ mkdir -p /tmp/hello$ cd /tmp/hello然后初始化一个新的Module:$...【详细内容】
2019-08-29  Tags: Go Module  点击:(216)  评论:(0)  加入收藏
▌简易百科推荐
zip 是一种常见的归档格式,本文讲解 Go 如何操作 zip。首先看看 zip 文件是如何工作的。以一个小文件为例:(类 Unix 系统下)$ cat hello.textHello!执行 zip 命令进行归档:$ zip...【详细内容】
2021-12-17  Go语言中文网    Tags:Go语言   点击:(13)  评论:(0)  加入收藏
大家好,我是 polarisxu。前段时间,Russ Cox 明确了泛型相关的事情,原计划在标准库中加入泛型相关的包,改放到 golang.org/x/exp 下。目前,Go 泛型的主要设计者 ianlancetaylor 完...【详细内容】
2021-11-30  Go语言中文网    Tags:slices 包   点击:(24)  评论:(0)  加入收藏
前言最近因为项目需要写了一段时间的 Go ,相对于 Java 来说语法简单同时又有着一些 Python 之类的语法糖,让人大呼”真香“。 但现阶段相对来说还是 Python 写的多一些,偶尔还...【详细内容】
2021-11-25  crossoverJie    Tags:Go   点击:(29)  评论:(0)  加入收藏
go-micro是基于 Go 语言用于开发的微服务的 RPC 框架,主要功能如下:服务发现,负载均衡 ,消息编码,请求/响应,Async Messaging,可插拔接口,最后这个功能牛p安装步骤安装proto...【详细内容】
2021-09-06    石老师小跟班  Tags:go-micro   点击:(197)  评论:(0)  加入收藏
GoLand 2021.2 EAP 5 现已发布。用户可以从工具箱应用程序中获得 EAP 构建,也可以从官方网站手动下载。并且从此 EAP 开始,只有拥有有效的 JetBrains 帐户才能加入该计划。手...【详细内容】
2021-06-29  IT实战联盟  今日头条  Tags:GoLand   点击:(185)  评论:(0)  加入收藏
作者:HDT3213今天给大家带来的开源项目是 Godis:一个用 Go 语言实现的 Redis 服务器。支持: 5 种数据结构(string、list、hash、set、sortedset) 自动过期(TTL) 发布订阅、地理位...【详细内容】
2021-06-18  HelloGitHub  今日头条  Tags:Go   点击:(125)  评论:(0)  加入收藏
统一规范篇合理规划目录本篇主要描述了公司内部同事都必须遵守的一些开发规矩,如统一开发空间,既使用统一的开发工具来保证代码最后的格式的统一,开发中对文件和代码长度的控制...【详细内容】
2021-05-18  1024课堂    Tags:Go语言   点击:(232)  评论:(0)  加入收藏
闭包概述 闭包不是Go语言独有的概念,在很多编程语言中都有闭包 闭包就是解决局部变量不能被外部访问的一种解决方案 是把函数当作返回值的一种应用 代码演示总体思想:在函数...【详细内容】
2021-05-14  HelloGo  今日头条  Tags:Go语言   点击:(223)  评论:(0)  加入收藏
一时想不开,想了解一下Go语言,于是安装了并体验了一下。下载1. 进入golang.google.cn 点击Download Go 2.选择对应的操作系统,点击后开始下载。 安装1. windows下执行傻瓜式安...【详细内容】
2021-05-12  程序员fearlazy  fearlazy  Tags:Go语言   点击:(236)  评论:(0)  加入收藏
1.简介channel是Go语言的一大特性,基于channel有很多值得探讨的问题,如 channel为什么是并发安全的? 同步通道和异步通道有啥区别? 通道为何会阻塞协程? 使用通道导致阻塞的协程...【详细内容】
2021-05-10  程序员麻辣烫  今日头条  Tags:Go通道   点击:(274)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条