【发布时间】:2021-06-30 22:53:29
【问题描述】:
我遇到了一个似乎是 Go 模块的存储库,但其中没有 go.mod 文件:github.com/confluentinc/confluent-kafka-go。
go 模块没有带有依赖关系的 go.mod 文件是否可以,或者该库的作者还没有迁移到模块?
【问题讨论】:
-
一个“模块”是一组“包”一起版本化。
标签: go go-modules
我遇到了一个似乎是 Go 模块的存储库,但其中没有 go.mod 文件:github.com/confluentinc/confluent-kafka-go。
go 模块没有带有依赖关系的 go.mod 文件是否可以,或者该库的作者还没有迁移到模块?
【问题讨论】:
标签: go go-modules
依赖模块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)。
【讨论】:
go.mod 文件。
go.mod 是强制性的。
模块由其 go.mod 文件定义。没有 go.mod 文件,它就不是一个模块。
从Go Modules Reference看到这个
模块是一起发布、版本控制和分发的软件包的集合。模块可以直接从版本控制存储库或模块代理服务器下载。
模块由模块路径标识,该路径在 go.mod 文件中声明,以及有关模块依赖项的信息。模块根目录是包含 go.mod 文件的目录。
和
模块由其根目录中名为 go.mod 的 UTF-8 编码文本文件定义。
【讨论】:
go.mod 文件,它就不是一个模块。但是,当我说 go get github.com\confluentinc\confluent-kafka-go 时,go 开始构建它,就好像它是一个模块一样。
go get 命令从 1.0 开始可用(如果不是更早的话),在 1.11 之前你只能做 go get [package] (不是模块,因为没有任何模块),在 1.11 之后你仍然可以做 go get [package] 但也可以做 go get [module] ,请参阅adding dependencies。你会在 github 上找到很多没有 go.mod 文件但仍然是 go-gettable 的项目。
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。
讨论摘要:
答案是“不”!
这个项目 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
而且效果惊人。
【讨论】: