【发布时间】:2019-12-31 13:33:36
【问题描述】:
在某个随机文件夹中,有 3 个文件夹 a、b、c。这些文件夹中的每一个都包含一个 mod 文件。
mod 文件包含以下 .
go.mod 里面的一个
module a
go 1.13
go.mod 里面的 b
module b
go 1.13
require a v0.0.0
replace a v0.0.0 => ./../a
c 中的 go.mod
module c
go 1.13
require b v0.0.0
replace b v0.0.0 => ./../b
模块 b 不会引发错误。但是模块 c 抛出错误
go: b@v0.0.0 requires
a@v0.0.0: unrecognized import path "a" (import path does not begin with hostname)
每个模块的模块名称中都必须有一个点(.)。
“一些随机文件夹”更改为 example.com。现在 example.com 命名文件夹包含所有 a.b.c 文件夹。这是模块现在的样子
模块A看起来像
module example.com/a
go 1.13
模块 B 的样子
module example.com/b
go 1.13
require example.com/a v0.0.0
replace example.com/a v0.0.0 => ../a
模块 C 的样子
module example.com/c
go 1.13
require example.com/b v0.0.0
replace example.com/b v0.0.0 => ../b
太糟糕了!错误!
go: example.com/b@v0.0.0 requires
example.com/a@v0.0.0: unrecognized import path "example.com/a" (https fetch: Get
https://example.com/a?go-get=1: dial tcp 208.73.210.202:443: connect: connection refused)
本地模块的传递依赖是如何工作的? 为什么 Go 要访问 example.com 来带来模块? 怎么回事?
【问题讨论】:
-
“一些聪明的开发人员认为每个模块的模块名称中都必须有一个点 (.)。”因为一些聪明的开发人员实际上理解 Go 导入的用途——它们应该是
go get-able,而不仅仅是磁盘上的任意目录。 -
@Adrian 不要生我的气!它非常个人主义的政策。举个例子,除非你在派对上穿红色睡衣,否则你不会得到食物,而你穿任何你想要的东西......来参加派对......我们会给你红色睡衣,然后你有食物... Go 假设有人要编写模块并将其推送到存储库,我将继续处理它... 它不假设(但它提供了使用它的机制)我可以创建多个随机模块在磁盘上而不是试图将它们推到任何地方!
-
正确。这就是 Go 模块的工作方式。 (完全合理的)假设是任何软件项目都会有一个存储库。通常,除了一次性的单文件脚本之外,任何软件项目的第一步都是为其创建一个存储库,因此这应该不是问题。如果您正在制作一个复杂的、多模块、相互依赖的软件项目并且您没有存储库,那么问题不在于 Go 模块对任意本地模块的支持,而是您没有使用源代码控制。
标签: go go-modules