`cmd/go:误导性的错误,适用于在go.mod中跟随模块指令的版本,

omqzjyyz  于 6个月前  发布在  Go
关注(0)|答案(7)|浏览(53)

A module can not declare its own version in go.mod even though

  • this is a basic need, not everyone gets its code through a git dump
  • the json structure outputted by "go mod edit -fmt -json" clearly provides for it, and
  • the error message reafirms a version should be possible

module test/dummy v0.0.1

go: errors parsing go.mod:
go.mod:1: usage: module module/path [version]
7kqas0il

7kqas0il1#

你目前无法完成的具体目标是什么?
你是提议将这个改变作为标签使用的替代方案,还是作为它们的补充?
go 工具如何找到特定的版本?现在它只是列出了标签和分支。用你的方法,可能需要查看对 go.mod 文件所做的每一个更改,这可能会更加耗费精力。
此外,请注意“git dump”并不总是必要的。有了公共模块镜像的存在,你就可以在不需要使用任何版本控制系统的情况下下载Go模块的特定版本:https://blog.golang.org/modules2019

tkqqtvp1

tkqqtvp12#

你不能依赖git标签或分支,因为源文件会经常被剪切、粘贴、移动和分叉等人们常做的事情,在这个过程中丢失了SCM元数据(更不用说一些git历史记录非常庞大,人们故意修剪它们),所以唯一可靠跟踪一组文件版本的方法是阅读模块描述符。
这与在go.mod中显式写出模块名的效果相同,而依赖隐含信息(GOPATH中的目录层次结构、URLs、git远程)不起作用。
go.mod最终使模块名变得明确且可靠,但版本控制仍然不存在。
此外,当你需要管理一堆代码时,有些是用Go编写的,其他则是用其他语言编写的,解析文本描述符相对容易,而运行各种特定语言的工具以获取版本控制信息则不容易。
这并不意味着go工具应该忘记标签或分支,它应该将结果写入go.mod,这样就不会丢失SCM元数据的信息,并检查go.mod中的信息是否与在获取代码时看到的SCM元数据一致(因为如果不一致,就说明出了问题,通常是在SCM中快速且粗略地进行剪切、粘贴和提交)。

zxlwwiss

zxlwwiss3#

为了提供另一种视角,我正在尝试将Go集成到专注于全周期软件管理的系统中。正如Russ Cox在https://research.swtch.com/deps中自己写的那样,当前的Go工具姿态几乎仅限于面向外部的“我需要下载哪些代码来构建这个代码”。
在一个全周期管理系统中,您还需要回答诸如“这段代码是什么”、“它的版本是多少”、“这个二进制是如何构建的,以及从哪个代码构建的”等问题。因此,强大的命名和版本信息不仅仅局限于第三方代码,还需要涵盖调用此第三方代码的代码库。

a8jjtwal

a8jjtwal4#

并非所有人都通过git dump获取其代码。
这是真的,但如果你想在模块模式下构建,你确实需要一种方法来解析版本到具体的模块。
我们有一个协议来实现这个功能,该协议在资源路径和.info文件中传递版本信息。请参阅https://tip.golang.org/cmd/go/#hdr-Module_proxy_protocol。

4si2a6ki

4si2a6ki5#

你也需要回答诸如“这是什么代码”、“它的版本是多少”、“这个二进制文件是如何构建的,以及从什么代码构建的”等问题。

参见$x_{1m0n1}^{x}$和$x_{1e0f}^{1x}$.

vlju58qv

vlju58qv6#

就我所知,这里报告的唯一一个未被现有问题涵盖的问题是解析器的错误信息。

8gsdolmq

8gsdolmq7#

HDR协议对于追踪代码作者的版本意图是没有用的,因为它依赖于生成的文件,信息本身并不存在于代码作者编写的源文件中。go get将共享一个简单的版本号与你的代码用户的所有聪明才智变成了一项庞大的基础设施工作。

此外,从我现在看到的规范来看,HDR忘记了最初帮助人们通过普通文件服务器共享go代码的意图,你需要特定的工具来生成信息文件,列表元素是一个索引,每次在仓库中添加新模块时都需要重新生成(但我不会对此进行更多评论,因为仔细观察它是下一步要做的事)

相关问题