当前位置:首页 > 文章列表 > Golang > Go教程 > Golang 1.16 中 Modules的主要变化更新

Golang 1.16 中 Modules的主要变化更新

来源:脚本之家 2023-01-09 12:31:41 0浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Golang 1.16 中 Modules的主要变化更新》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下modules、变化,希望所有认真读完的童鞋们,都有实质性的提高。

01介绍

Golang 1.16 已经正式发布了,其中 Modules 有一些变化:

  • 默认开启 Modules。
  • 不自动修改 go.mod 和 go.sum。
  • 通过指定 @version 后缀安装特定版本可执行文件。
  • 新增 retract 指令撤回 Module 版本。
  • 使用新增配置变量 GOVCS 指定特定模块使用特定版本控制工具。

golang 1.16 默认开启 Modules,即使不存在go.mod,Go 命令现在默认情况下也会在module-aware(模块感知)模式下构建包。

在 golang 1.16 中,通过设置关闭GO111MODULE环境变量,在GOPATH模式下构建包仍然是可能的。您还可以将GO111MODULE设置为auto,以便在当前目录或任何父目录中存在go.mod文件时启用module-aware(模块感知)模式。您还可以使用go env -w永久设置GO111MODULE和其他变量,:

goenv-wGO111MODULE=auto

Go 官方计划在Go 1.17中放弃对GOPATH模式的支持。换句话说,Go 1.17将忽略GO111MODULE。如果您的项目不在module-aware(模块感知)模式下构建,则现在是时候迁移至module-aware(模块感知)模式了。

03不自动修改go.mod和go.sum

在 golang 1.16 之前版本中,当 go 命令发现go.modgo.sum存在问题时,如缺少require指令或缺少sum,它将尝试自动解决问题。Go 官方收到很多反馈,这种行为是令人惊讶的,特别是对于 go 命令,如go list,通常没有副作用。自动修复并不总是可取的:如果任何所需模块不提供导入的包,Go 命令将添加新的依赖项,可能触发常见依赖项的升级。即使输入路径拼写错误,也会导致(失败的)网络查找。

在 golang 1.16 中,module-aware(模块感知)命令在go.modgo.sum中发现问题后报告错误,而不是尝试自动解决问题。在大多数情况下,错误消息中列出建议命令来解决问题,例如:

$ go build
example.go:3:8: no required module provides package golang.org/x/net/html; to add it:
 go get golang.org/x/net/html
$ go get golang.org/x/net/html
$ go build

golang 1.16 与 Go 之前版本一样,如果vendor目录存在,Go 命令可能会使用vendor目录。go getgo mod tidy命令仍然修改go.modgo.sum,因为他们的主要目的是管理依赖关系。

04通过指定@version后缀安装特定版本可执行文件

go install命令现在可以通过指定@version后缀安装特定版本的可执行文件,例如:

go install golang.org/x/tools/gopls@v0.6.5

如果使用@version后缀,go install命令使用该确切 Module 版本,忽略当前目录和父目录中的任何go.mod文件中的 Module 版本。

如果没有@version后缀,go install继续运行,因为它一直有,建立程序使用当前模块的go.mod文件中 requirements 列表和 replacements 列表列出的版本。

为了消除使用哪个版本的模糊性,在使用此安装语法go install program@latest时,Go 程序的 go.mod 文件中可能存在几个限制的指令。特别是,至少目前不允许replaceexclude指令。从长远来看,一旦新的go install program@version在大多数使用情况下工作的很好的前提下,Go 官方计划在未来某个版本中让go get命令停止安装二进制文件。

05新增retract指令撤回 Module 版本

您是否在模块版本准备好之前意外地发布了该版本?或者,您是否在发布需要快速修复的版本后发现了问题?已发布版本中的错误很难更正。为了保持模块生成的确定性,版本发布后无法修改。即使您删除或更改了版本标签,proxy.golang.org和其他代理可能已经有原始缓存。

模块作者现在可以使用go.mod中的retract指令 retract 模块版本。retract 的版本仍然存在,可以下载(因此依赖于它的构建不会中断),但 go 命令在解决@latest等版本时不会自动选择它。go getgo list -m -u会打印有关现有用途的警告。

例如,假设一个流行的库的作者example.com/lib发布 v1.0.5,然后发现一个新的安全问题。他们可以添加指令到他们的go.mod文件,例如:

//Remote-triggeredcrashinpackagefoo.SeeCVE-2021-01234.
retractv1.0.5

接下来,作者可以 tag 和 push 版本 v1.0.6,新的最高版本。在此之后,已依赖 v1.0.5 的用户在检查更新或升级依赖包时将收到撤回通知。通知消息可能包括收回指令上方注释的文本。例如:

$ go list -m -u all
example.com/lib v1.0.0 (retracted)
$ go get .
go: warning: example.com/lib@v1.0.5: retracted by module author:
 Remote-triggered crash in package foo. See CVE-2021-01234.
go: to switch to the latest unretracted version, run:
 go get example.com/lib@latest

06使用新增配置变量 GOVCS 指定特定模块使用特定版本控制工具

go 命令可以从镜像proxy.golang.org或直接从版本控制存储库下载模块源代码,使用 git、hg、svn、bzr 或 fossil。直接版本控制访问很重要,尤其是对于代理上不可用的私有模块,但它也可能是一个安全问题:版本控制工具中的错误可能被恶意服务器利用来运行恶意代码。

Go 1.16 引入了一个新的配置变量 GOVCS,它允许用户指定哪些模块允许使用特定的版本控制工具。GOVCS 接受一个逗号分隔的模式列表:vcslist 规则。

模式是一条path.Match。匹配模式匹配模块路径的一个或多个主要元素。公共和私有的特殊模式匹配公共和私有模块(私有定义为与 GOPRIVATE 中的模式匹配的模块;公共是其他一切模块)。vcslist 是允许版本控制命令或关键字 all 或 off 的管道分隔列表。例如:

GOVCS=github.com:git,evil.com:off,*:git|hg

使用此设置,可以使用 git 下载带有github.com路径的模块;无法使用任何版本控制命令下载evil.com上的路径,使用 git 或 hg 下载所有其他路径(*匹配所有内容)的模块。

如果未设置环境变量 GOVCS,或者如果模块与任何模式不匹配,Go 命令将使用 GOVCS 的默认值:允许 git 和 hg 用于公共模块,并且允许所有工具用于私有模块。

设置只允许使用 Git 和 Mercurial 的理由是,这两个版本控制工具最关注作为不受信任服务器的客户端运行的问题。相比之下,Bazaar、Fossil 和 Subversion 主要用于受信任的、经过验证的环境中,而且没有像 attack surfaces 那样受到很好的审查。即默认设置为:

GOVCS=public:git|hg,private:all

07Module 未来发展

我们希望您发现这些功能很有用。我们已经开始开发 Go 1.17 的模块功能,特别是懒惰的模块加载,这应该使模块加载过程更快,更稳定。

08总结

本文主要介绍了 Golang 1.16 针对 Module 做的一些变化。通过 Go 官方的这些 Module 变化,切实解决了 Go 用户在使用 Go 时的实际问题。Go 官方也表示会在 Golang 1.17 计划彻底去除GOPATH模式,所以,如果您的项目目前还没有迁移到 Module 模式,是时候开始迁移了。

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Golang 1.16 中 Modules的主要变化更新》文章吧,也可关注golang学习网公众号了解相关技术文章。

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
秒懂Golang匿名函数秒懂Golang匿名函数
上一篇
秒懂Golang匿名函数
Golang中的自定义类型之间的转换的实现(type conversion)
下一篇
Golang中的自定义类型之间的转换的实现(type conversion)
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    514次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    499次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • SEO  AI Mermaid 流程图:自然语言生成,文本驱动可视化创作
    AI Mermaid流程图
    SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
    616次使用
  • 搜获客笔记生成器:小红书医美爆款内容AI创作神器
    搜获客【笔记生成器】
    搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
    621次使用
  • iTerms:一站式法律AI工作台,智能合同审查起草与法律问答专家
    iTerms
    iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
    639次使用
  • TokenPony:AI大模型API聚合平台,一站式接入,高效稳定高性价比
    TokenPony
    TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
    705次使用
  • 迅捷AIPPT:AI智能PPT生成器,高效制作专业演示文稿
    迅捷AIPPT
    迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
    603次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码