在某个随机文件夹中,有 3 个文件夹 a、b、c。每个文件夹都包含一个 mod 文件。mod 文件包含以下内容。go.mod 里面module ago 1.13b 内的 go.modmodule bgo 1.13require a v0.0.0replace a v0.0.0 => ./../ac 内的 go.modmodule cgo 1.13require b v0.0.0replace b v0.0.0 => ./../b模块 b 没有抛出任何错误。但模块 c 抛出错误go: b@v0.0.0 requiresa@v0.0.0: unrecognized import path "a" (import path does not begin with hostname)每个模块的模块名称中都必须有一个点(.)。“一些随机文件夹”更改为 example.com。现在 example.com 命名的文件夹包含所有 abc 文件夹。这是模块现在的样子模块A看起来像module example.com/ago 1.13模块 B 看起来像module example.com/bgo 1.13require example.com/a v0.0.0replace example.com/a v0.0.0 => ../a模块 C 看起来像module example.com/cgo 1.13require example.com/b v0.0.0replace example.com/b v0.0.0 => ../b太糟糕了!错误!go: example.com/b@v0.0.0 requiresexample.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 来引入模块?到底是怎么回事?
1 回答
胡子哥哥
TA贡献1825条经验 获得超6个赞
Go Wiki:模块:go.mod
exclude
指令replace
仅在当前(“主”)模块上运行。构建主模块时,将忽略主模块以外的模块中的指令exclude
。replace
因此, and语句允许主模块完全控制其自己的replace
构建exclude
,而不受依赖项的完全控制。(
同样在命令中:主模块和构建列表:
主模块的 go.mod 文件通过 require、replace 和 except 语句定义了可供 go 命令使用的精确包集。通过以下 require 语句找到的依赖模块也有助于定义该组包,但只能通过其 go.mod 文件的 require 语句:依赖模块中的任何替换和排除语句都将被忽略。因此,替换和排除语句允许主模块完全控制其自己的构建,而不受依赖项的完全控制。
a
构建模块时找不到包c
,因此该go
工具尝试解决它,尝试下载它。这就是为什么它尝试将包名称解释为应以主机名开头的名称。
您不需要将包重命名a
为example.com/a
,但必须在s中添加一个replace
指令来告诉包所在的位置。c
go.mod
a
- 1 回答
- 0 关注
- 109 浏览
添加回答
举报
0/150
提交
取消