猿问

如何解决本地模块的传递依赖

在某个随机文件夹中,有 3 个文件夹 a、b、c。每个文件夹都包含一个 mod 文件。


mod 文件包含以下内容。


go.mod 里面


module a


go 1.13

b 内的 go.mod


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 命名的文件夹包含所有 abc 文件夹。这是模块现在的样子


模块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 来引入模块?到底是怎么回事?


森栏
浏览 110回答 1
1回答

胡子哥哥

Go Wiki:模块:go.modexclude指令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指令来告诉包所在的位置。cgo.moda
随时随地看视频慕课网APP

相关分类

Go
我要回答