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

Golang1.16中Modules的主要变化更新

这篇文章主要介绍了Golang1.16中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 1.16 中 Modules的主要变化更新的文章就介绍到这了,更多相关Golang Modules变化内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • SVN自动化正文共:5007 字预计阅读时间: 13 分钟平时自己多用Git来做版本控制,但很多公司内部依旧使用SVN,核心原因其实就是SVN够用了,懒得换,虽然自己用git,但对 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • SVN安装配置和使用
    简介:SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS ... [详细]
  • SVN 功能说明(简版)
    Subversion(SVN)是什么?SVN是一种版本管理系统,是开源软件的基石。即使在沟通充分的情况下,多人维护同一份源代码的一定也会 ... [详细]
  • 双十一在家学用 Git
    对于所有的开发者来说,掌握一门代码版本控制系统都是必须的,无论是自己做项目,团队合作,工作中的合作,都离不开版 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 删除iPad或iPhone目录privatevarkeychainskeychain-2.db文件,重启iPad或iPhone。1.如何卸载机内自带软件? ... [详细]
author-avatar
太阳之神sqh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有