Jay Conrod
2021年2月18日

我们希望您喜欢Go 1.16!此版本具有许多新功能,尤其是对于模块。该发行说明描述这些变化短暂,但让我们来看看其中的几个深入。

默认情况下开启模块

go默认情况下,即使没有命令,该命令现在也默认以模块感知模式构建软件包go.mod。这是在所有项目中使用模块的重要一步。

通过将GO111MODULE环境变量设置为GOPATH模式仍然可以构建软件包off。您还可以设置GO111MODULEauto仅在当前目录或任何父目录中存在go.mod文件时启用模块感知模式。这以前是默认设置。请注意,您可以GO111MODULE使用go env -w以下命令永久设置和其他变量:

go env -w GO111MODULE=auto

我们计划在Go 1.17中放弃对GOPATH模式的支持。换句话说,Go 1.17将忽略GO111MODULE。如果您的项目不是以模块感知模式构建的,那么现在该迁移了。如果存在阻止您迁移的问题,请考虑提交问题或经验报告。

不会自动更改go.mod和go.sum

此前,当go命令发现问题,go.modgo.sum像一个丢失的require指令或丢失的总和,它会自动尝试解决这个问题。我们收到了很多反馈,认为这种行为令人惊讶,尤其是对于go list通常没有副作用的命令。自动修复并非总是可取的:如果任何必需的模块未提供导入的软件包,则该go命令将添加新的依赖项,从而可能触发常见依赖项的升级。甚至错误拼写的导入路径也会导致(失败的)网络查找。

在Go 1.16中,支持模块的命令在发现问题后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

和以前一样,该go命令可以使用vendor目录(如果存在的话)(有关详细信息,请参见供应商)。命令likego getgo mod tidy仍会修改go.modand go.sum,因为它们的主要目的是管理依赖项。

安装特定版本的可执行文件

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

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

使用此语法时,请go install从该确切模块版本安装命令,而忽略go.mod当前目录和父目录中的所有文件。(不带@version后缀,将go install继续按原样运行,使用当前模块中列出的版本要求和替换来构建程序go.mod。)

我们曾经建议go get -u program安装一个可执行文件,但是这种用法与go get中添加或更改模块版本要求的含义造成了太多混淆go.mod。为了避免意外修改go.mod,人们开始建议更复杂的命令,例如:

cd $HOME; GO111MODULE=on go get program@latest

现在我们都可以go install program@latest代替使用。有关go install详细信息,请参见。

为了消除关于使用哪个版本的歧义go.mod,使用此安装语法时,程序文件中可能存在哪些指令有一些限制。特别是,至少目前不允许使用replaceexclude指令。从长远来看,一旦新功能go install program@version可以在足够的用例中正常运行,我们计划go get停止安装命令二进制文件。有关详细信息,请参见问题43684。

模块缩回

您是否曾经在准备就绪之前意外发布了模块版本?还是在发布需要快速修复的版本后立即发现问题?发布版本中的错误很难纠正。为了保持模块构建的确定性,发布版本后不能对其进行修改。即使您删除或更改了版本标签,proxy.golang.org其他代理也可能已经缓存了原始代理。

现在,模块作者可以使用中的指令撤消模块版本。缩回的版本仍然存在并且可以下载(因此依赖它的版本不会中断),但是在解析诸如的版本时,该命令不会自动选择它。 并且,将打印现有用途的警告。retractgo.modgo@latestgo getgo list -m -u

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

// Remote-triggered crash in package foo. See CVE-2021-01234.
retract v1.0.5

接下来,作者可以标记并推送v1.0.6新的最高版本version。此后,v1.0.5当检查更新或升级从属程序包时,已经通知已依赖的用户将撤消通知。通知消息可能包含retract指令上方注释中的文本。

$ 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

有关基于浏览器的交互式指南,请在play-with-go.dev上查看“收回模块版本” 。有关语法的详细信息,请参见指令文档。retract

使用GOVCS控制版本控制工具

go命令可以从像一面镜子下载模块的源代码proxy.golang.org或直接从一个版本控制库使用githgsvnbzr,或fossil。直接版本控制访问非常重要,尤其是对于代理中不可用的私有模块而言,但这也可能是安全问题:版本控制工具中的错误可能被恶意服务器利用以运行意外的代码。

Go 1.16引入了一个新的配置变量,GOVCS它使用户可以指定允许哪些模块使用特定的版本控制工具。 GOVCS接受以逗号分隔的pattern:vcslist规则列表。的pattern是一个path.Match模式匹配的一个或一个模块路径的更主导的元件。特殊模式publicprivate匹配的公共模块和私有模块(private被定义为由模式匹配的模块GOPRIVATEpublic其他所有内容)。的vcslist是允许的版本控制命令或关键字的管子分隔的列表alloff

例如:

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

通过此设置,github.com可以使用来下载打开了路径的模块gitevil.com无法使用任何版本控制命令下载上的路径,并且*可以使用git或下载其他所有路径(匹配所有内容)hg

如果GOVCS未设置,或者模块与任何模式都不匹配,则该go命令使用以下默认值:githg允许用于公共模块,并且允许使用所有工具用于私有模块。仅允许使用Git和Mercurial的原因是,这两个系统最关注作为不受信任服务器的客户端运行的问题。相反,Bazaar,Fossil和Subversion主要用于受信任的,经过身份验证的环境,并且没有像攻击面那样受到严格的审查。即,默认设置为:

GOVCS=public:git|hg,private:all

有关更多详细信息,请参见控制版本控制工具GOVCS

下一步是什么?

我们希望您发现这些功能有用。我们已经在努力开发Go 1.17的下一组模块功能,尤其是延迟模块加载,这应该使模块加载过程更快,更稳定。与往常一样,如果您遇到新的错误,请在问题跟踪器上告知我们。祝您编码愉快!

New module changes in Go 1.16相关推荐

  1. ubuntu 16.04 配置Python2.7 和 Python3.5 同时调用OpenCV

    安装OpenCV OpenCV 官网,下载见 SourceForge and GitHub. 若使用官网版本安装不成功,则可试试Github版本. 或者 git clone https://githu ...

  2. How to build openssl with fips module on Linux and Windows?

    Build Openssl With Fips Module On Windows 参考github上的文档 https://github.com/ColdDragon/windows-build-o ...

  3. [3] Window PowerShell DSC 学习系列----如何在PowerShell DSC 5.x 安装最新的DSC Module?

    在PowerShell DSC 4.0的版本的时候,所有的resource Kit必须从一个网站上下载,然后拷贝到相应的目录,比如 PS C:\Users\rodneyzhu.BEIJING> ...

  4. 解决可视化问题:module 'matplotlib.mlab' has no attribute 'normpdf'----使用scipy中的函数代替

    解决可视化问题:module 'matplotlib.mlab' has no attribute 'normpdf' 今天在学习可视化绘制直方图,并添加拟合曲线时遇到了一个问题,即题目中所写modu ...

  5. DeepLabV3+语义分割实战

    DeepLabV3+语义分割实战 语义分割是计算机视觉的一项重要任务,本文使用Jittor框架实现了DeepLabV3+语义分割模型. DeepLabV3+论文:https://arxiv.org/p ...

  6. ab测试nginx Nginx性能优化

    转自:https://www.cnblogs.com/nulige/p/9369700.html 1.性能优化概述 在做性能优化前, 我们需要对如下进行考虑 1.当前系统结构瓶颈 观察指标 压力测试 ...

  7. mysql数据库备份总结_mysql中mysqlhotcopy备份数据库总结

    mysqlhotcopy是mysql数据库中一个备份工具,相对于mysqldump是一个快速文件意义上的COPY,mysqlhotcopy是一个数据库端的SQL语句集合. mysqlhotcopy用法 ...

  8. Yolov5总结文档(理论、代码、实验结果)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨Mr.Hang@知乎 来源丨https://zhuanlan.zhihu.com/p/44925 ...

  9. PHP内核介绍及扩展开发指南—Extensions 的编写

    Extensions 的编写 理解了这些运行机制以后,本章着手介绍Extensions 的编写,但凡写程序的人都知道hello world,那好,就从hello world开始. 1.1Hello W ...

最新文章

  1. python代码转换为pytorch_python、PyTorch图像读取与numpy转换
  2. autocad.net中ResultBuffer相关的常量值
  3. 服务器升级中不能修改,windows10下更新服务器为何改不了了
  4. 微信公众平台 分享到朋友圈 js代码
  5. 华为云 mysql 主备_安全性能两手抓,华为云MySQL“非双一特性”助力企业业务稳定高效运行...
  6. 我在项目中对 MySQL 做的优化
  7. eclipse linux c开发环境,Eclipse下搭建C/C++开发环境
  8. 07-netty之Socket
  9. 水晶报表 mysql_水晶报表CrystalReport2008使用JDBC连接MySQL数据库-详细步骤
  10. 自旋锁spin : spin_lock_irq , spin_lock_irqsave
  11. 游戏中的数学与物理学 第二版_在数学课堂中适度开展游戏活动,可以提高课堂教学效率...
  12. 一次多线程臭虫经验——异步日志c++化时
  13. webpack,vue中定义的别名怎么在模板, css sass less的图片地址上使用
  14. Ubuntu16.04下安装NVIDIA显卡驱动
  15. Visio 2003 sp3下载
  16. ABS系统类最新发表的论文趋势怎么看?
  17. 阿里巴巴国际站 网站和PC客户端都登录不了,其他电脑或手机可以
  18. 基于STM32的ESP8266模块控制多路继电器
  19. 新零售是否为线上线下物流三者的融合?
  20. 父类声明子类实例化对象详解

热门文章

  1. 原生H5 select自动提示搜索
  2. Office2010-2016官方镜像大全
  3. android app打开另一个app并触发按钮_Android进程调度:Low memory killer(4)修改版
  4. python代码评测结果tle_TLE计算列表中指定范围内的元素数 - python
  5. 二分实现:查找数组中的峰值元素
  6. 3dvary灯光材质为什么不亮_详解CG灯光渲染师的职业技能
  7. vue_ form表单 v-model
  8. 看看async,await 是如何简化异步的调用WCF!
  9. 今天讲讲hibernate的简单使用
  10. Linux容器能否弥补IoT的安全短板?