【问题标题】:Can a go module have no go.mod file?go 模块可以没有 go.mod 文件吗?
【发布时间】:2021-06-30 22:53:29
【问题描述】:

我遇到了一个似乎是 Go 模块的存储库,但其中没有 go.mod 文件:github.com/confluentinc/confluent-kafka-go。

go 模块没有带有依赖关系的 go.mod 文件是否可以,或者该库的作者还没有迁移到模块?

【问题讨论】:

标签: go go-modules


【解决方案1】:

依赖模块do not need to have explicit go.mod files.

模块模式下的“主模块”——即包含go命令的工作目录的模块——必须有一个go.mod文件,以便go命令可以找出导入路径该模块中的包(基于其module path),以便在解决后有一个地方记录其依赖关系。

此外,使用replace directives 插入的任何模块都必须有go.mod 文件(以减少由于拼写错误或替换路径中的其他错误引起的混乱)。

但是,一般来说,缺少显式 go.mod 文件的模块是有效的并且可以很好地使用。它的有效模块路径是 required 的路径,如果同一个存储库最终通过多个路径使用,这可能会有点混乱。由于没有go.mod 文件的模块不一定指定它自己的依赖项,因此该模块的使用者必须自己填写这些依赖项(go mod tidy 将在使用者的go.mod 文件中将它们标记为// indirect)。

【讨论】:

  • 感谢您提供此答案。我会接受你的答案是正确的,但我觉得它缺少对官方文档的引用。此外,@Hymns For Disco 提供的官方文档的引用与此答案相矛盾。对我来说,官方的 Go 文档对 Go 模块实现的细节有点松散,造成混乱,需要改进和更严格的方法。
  • 我已更新答案以链接到 Go 模块参考文档的相关部分。 FWIW,我认为这与另一个答案中链接的文档没有任何矛盾:模块“是一起发布、版本化和分发的包的集合”,它由模块路径标识,但那些属性不一定要求存在明确的go.mod 文件。
  • 谢谢,我将接受的答案转移到了这个。 “模块由其根目录中名为 go.mod 的 UTF-8 编码文本文件定义”部分。听起来go.mod 是强制性的。
  • 这很好。我已发送golang.org/cl/331949 试图澄清;如果您认为可以进一步改进,请随时在此处发表评论!
【解决方案2】:

模块由其 go.mod 文件定义。没有 go.mod 文件,它就不是一个模块。

Go Modules Reference看到这个

模块是一起发布、版本控制和分发的软件包的集合。模块可以直接从版本控制存储库或模块代理服务器下载。

模块由模块路径标识,该路径在 go.mod 文件中声明,以及有关模块依赖项的信息。模块根目录是包含 go.mod 文件的目录。

模块由其根目录中名为 go.mod 的 UTF-8 编码文本文件定义。

【讨论】:

  • @StevenPenny Aha,所以我们在这里的条款上有分歧,我的问题正是关于它。从文档中我认为如果它没有@Hymns For Disco 建议的go.mod 文件,它就不是一个模块。但是,当我说 go get github.com\confluentinc\confluent-kafka-go 时,go 开始构建它,就好像它是一个模块一样。
  • @BorisBurkov 请注意,Go 中引入的模块要晚得多,在 1.11 版中,在此之前您只有 packagesprogramsgo get 命令从 1.0 开始可用(如果不是更早的话),在 1.11 之前你只能做 go get [package] (不是模块,因为没有任何模块),在 1.11 之后你仍然可以做 go get [package] 但也可以做 go get [module] ,请参阅adding dependencies。你会在 github 上找到很多没有 go.mod 文件但仍然是 go-gettable 的项目。
  • 在实际建立模块文件之前,模块范围可能在哪里是模棱两可的。一个存储库中可能有多个模块。您甚至可以在同一个模块中拥有多个存储库(尽管它很难管理)。值得注意的是,在 go.mod 文件被删除之前,这个存储库确实是多个模块。 github.com/confluentinc/confluent-kafka-go/commit/…
  • @StevenPenny 我做了一个测试。我说go get github.com/BurkovBA/django-rest-framework-mongoengine,这是一个带有 python 项目的 repo。它起作用了,go get 将它添加到我的go.mod 文件中,就好像它是一个有效的依赖项一样,并将 repo 下载到pkg/mod 模块缓存中,而不检查go.mod 文件或任何东西。文档说从 go 1.16 开始go install 是构建模块的推荐选项,而go get 更多的是关于管理下载:golang.org/ref/mod#go-get
  • @BorisBurkov 不管你怎么称呼它,它肯定不是一个有效的 go 模块。
【解决方案3】:

讨论摘要:

答案是“不”!

这个项目 contains a set of go packages,但它不是 Go 模块,因为它不包含 go.mod 文件(尽管之前是 used to be a multi-module repo (Go))。

go get 可以以两种方式运行:模块感知模式和传统 GOPATH 模式(从 Go 1.16 开始)。

要了解更多信息,请使用go 命令参考文档:

$ go help gopath-get

$ go help module-get

它会说明go get 在这两种情况下的工作原理。

此外,我注意到它可以下载任何存储库并将其视为 Go 包,即使它包含任意 Python 项目。

我做了一个简单的测试来证明这一点:

$ go get github.com/mongoengine/mongoengine

而且效果惊人。

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多