利用伪版本和GoCenter做大

更新:自2021年5月1日起,GoCenter中央存储库已被淘汰,所有功能已弃用。有关中心日落的更多信息,请阅读弃用博客文章

围棋模块已经为围棋开发带来了秩序,但其中也潜藏着一些混乱。管理模块伪版本可能很困难,特别是在Go的一些最新更改中。

JFrog GoCenter, versioned的免费存储库去模块,现在包含了一些重要的更新,可以帮助你保持正确的方向。让我们来看看伪版本是如何工作的,以及您可以从这些更改中得到什么。我们还提供了一些指导,让您的Go构建在升级到Go 1.13或更高版本时正常工作。

模块版本控制

版本控制的能力去模块是一个关键特性,为开发人员提供了一种方法,以确保他们的应用程序使用他们想要的依赖项。当模块被版本化时,应用程序可以指定使用一个它们知道将与运行时的其余部分兼容的模块版本。

Go模块的版本是通过在底层源存储库中标记它的修订来分配的。的命令使用语义版本控制标准的形式vX.Y.Z描述模块版本。版本号根据API中的更改而更改:

根据这个标准格式,可以比较模块版本,以确定哪个应该被认为是最新的或最新的。

使用Pseudo-Versions

版本化的Go模块是为通用而发布的,应该是大多数开发人员的首选。但是,在某些情况下,您不能发布模块的最新版本。

例如,一个团队可能需要在开发过程中共享一个临时版本。当一个依赖的项目还没有发布版本,所以它还没有被标记为版本时,情况尤其如此。类似地,您可能需要针对尚未标记的提交进行开发。

要使用模块的无标记版本作为依赖项,它必须被模块的pseudo-version标识符。伪版本的格式如下:

3种可接受的伪版本形式

  • vX.0.0-yyyymmddhhmmss-abcdefxyz当没有较早版本时,在目标提交之前使用适当的主版本提交
  • vX.Y.Z-pre.0。yyyymmddhhmmss-abcdefxyz当最新版本提交之前的目标提交是vX.Y.Z-pre
  • vX.Y。(Z + 1) 0。yyyymmddhhmmss-abcdefxyz当目标提交是vX.Y.Z之前的最新版本提交

作为最佳实践,伪版本字符串永远不应该手工输入。go命令将接受普通提交哈希并自动将其转换为伪版本。此方法有助于根据生成的时间戳比较修订。

例如,命令可能只对模块查询使用commit散列:

->访问github.com/x/sys@c856192#记录v0.0.0-20180517173623-c85619274f5d

不让go命令自动生成伪版本会有一些问题:

  • 伪版本参与最小版本选择。如果它的版本前缀不准确,伪版本可能看起来比它后面的版本具有更高的优先级,有效地将模块固定到该提交
  • 伪版本中的提交日期提供了伪版本之间的总顺序,因此如果它被编辑,它将打乱顺序

尽管有这个建议,有时伪版本可能存在于手动编辑的go模块中。在其他情况下,完整的伪版本字符串可能由第三方工具生成。

更严格的规则

在1.12版本中,Go允许伪版本引用。大多数涉及伪版本的操作都接受版本字符串和日期的任意组合,并且只要该修订存在,就会解析为底层修订(通常是Git提交哈希)。

Go 1.13的发布带来了更严格的执行,以解决上述问题。Go 1.13限制了' Go '命令接受的伪版本,使一些以前接受但不是规范的版本无效。

go客户端现在根据版本控制元数据对伪版本的不同元素执行一些验证:

  • 标签伪版本的派生点指向命名的修订或底层VCS工具报告的它的祖先之一,或者伪版本不是从任何标记派生的(即在日期字符串前有一个“vX.0.0-”前缀),并使用适用于模块路径的最低主版本
  • 日期字符串在伪版本中匹配底层VCS工具报告的修订的UTC时间戳
  • 修订版的简称在伪版本中与go命令生成的短名称相同。
  • 伪版本包括一个+不相容的后缀仅当对应的主版本需要时使用,且仅当底层模块没有go.mod文件
  • 即使在从代理解析模块之后,go客户端也将尝试从校验和服务器,它强制执行相同的伪版本验证规则,并将拒绝提供校验和内容。

如何修复不适当的伪版本

为了迁移到Go 1.13,开发人员必须纠正所有不符合上述要求的伪版本引用。否则,go客户端将标记一个异常:

去获取golang.org/x/sys@v0.0.0-20190726090000-fde4db37ae7a:无效的伪版本:不匹配版本控制时间戳(2019-08-13T06:44:41Z)

幸运的是,这很容易通过你的go.mod文件你的伪版本引用的地方。

如果go.mod文件的需要指令有一个不正确的伪版本,这可以纠正

    1. 将完整的伪版本引用替换为仅提交哈希字符串
      需要{golang.org/x/sys fde4db37ae7a}

      运行整理衣柜让go客户端执行正确的替换。

    2. 如果某个传递依赖项引用了无效的伪版本,则可以使用取代指挥你的行动。Mod文件强制更正:
      替换golang.org/x/sys v0.0.0-20190726091711-fde4db37ae7a => golang.org/x/sys fde4db37ae7a

GoCenter如何提供帮助

GoCenter的一个重要原则是版本不可知。JFrog的社区工程团队已经对GoCenter进行了重要的更新,以支持所有版本的Go 1.13,我们正在进行进一步的更新,以适应Go 1.14的需求。

GoCenter现在通过重定向到正确的伪版本来帮助您遵守伪版本验证。GoCenter修改的元数据info使用正确的版本时,请求模块下载不正确的伪版本。

->curl https://gocenter.io/golang.org/x/sys/@v fde4db37ae7a.info{" name ": " v0.0.0-20190813064441-fde4db37ae7a ", " shortName ": " v0.0.0-20190813064441-fde4db37ae7a ", " version ": " v0.0.0-20190813064441-fde4db37ae7az ", " time ": " 2019-08-13T08:03:52Z "}

要使用GoCenter,请设置您的GOPROXY

GOPROXY = https://gocenter.io/

For Go 1.12

对于Go 1.12用户,GoCenter将更新go.mod文件保存在其存储库中,并使用正确的伪版本。GoCenter仍将提供在此更改之前在GoCenter中处理的不正确的伪版本。

->去的版本Go版本go1.12.14 darwin/amd64 ->访问golang.org/x/sys@v0.0.0- 201907260900000 -fde4db37ae7a去:找到golang.org/x/sys v0.0.0- 201907260900000 -fde4db37ae7a ->猫go.mod模块示例走1.12 require golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a // indirect

For Go 1.13

Go 1.13用户将收到一个错误消息,指向正确的伪版本。

->去的版本Go版本go1.13.5 darwin/amd64 ->访问golang.org/x/sys@v0.0.0- 201907260900000 -fde4db37ae7a去:找到golang.org v0.0.0-20190726090000-fde4db37ae7a去:找到golang.org/x v0.0.0-20190726090000-fde4db37ae7a去得到golang.org/x/sys@v0.0.0-20190726090000-fde4db37ae7a:代理返回的信息版本v0.0.0-20190813064441-fde4db37ae7a而不是请求的版本->猫go.mod模块example.com/mitali go 1.13

以便在去更新正确的伪版本。mod文件,走1.13用户需要修改只包含伪版本的提交哈希部分。

->去golang.org/x/sys@fde4db37ae7a去:找到golang.org fde4db37ae7a去:找到golang.org/x/sys fde4db37ae7a去:找到golang.org/x fde4db37ae7a ->猫go.mod模块example.com/mitali go 1.13 require golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a //间接

如果您希望覆盖此行为并让GoCenter提供先前处理的不正确的伪版本,那么您可以设置GOSUMDB =了

Go 1.14对模块有什么改变

正如我们所提到的,JFrog正在对GoCenter进行修改,以支持Go 1.14。下面是该版本中Go的一些变化,这些变化会影响模块的操作,您可能需要注意:

运行命令标志

      • 命令不再接受国防部国旗
      • mod =只读的如果没有顶级供应商目录,则默认设置。Mod文件为只读文件
      • -modfile =文件引入了新的标志,指示go命令读/写一个备用go。Mod文件和备用去。Sum文件也将被使用。虽然一个名为go的文件。Mod必须仍然存在,以便确定模块的根目录

go.mod文件changes

      • 会不会升级到一个+不兼容主要版本,除非明确要求或已经要求
      • Go命令(除了整理衣柜)不会移除一个需要指令,指定间接依赖项的版本,该版本已由主模块的其他依赖项暗示
      • mod =只读的标志,则go命令将不会由于缺少go指令或任何错误而失败

模块下载

      • Go命令现在支持颠覆存储库模块模式
      • Go命令现在包括来自模块代理和其他HTTP服务器的纯文本错误消息片段。只有当它是有效的UTF-8并且由垄断图形字符和空格组成时,才会显示错误消息。

继续使用GoCenter

随着围棋模块获得更广泛的接受,标准肯定会发生变化。您可以依靠JFrog GoCenter来跟上这些变化,并在需求发展时帮助您克服减速带。

如果你还没有探索GoCenter的Go模块的免费存储库然而,我们邀请你这样做!它有一个丰富的UI,可以帮助您检查关于所有600,000多个Go模块的数据,可以帮助您获得对所使用的GoLang依赖项的强大命令。