猿问

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

在某个随机文件夹内,有 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 来带来模块?到底是怎么回事?


幕布斯7119047
浏览 132回答 1
1回答

守候你守候我

Go Wiki:模块:go.modexclude和replace指令仅在当前(“主”)模块上运行。构建主模块时,将忽略主模块以外的模块中的指令exclude和指令。replace因此, replaceandexclude语句允许主模块完全控制自己的构建,而不受依赖项的完全控制。(有关何时使用指令的讨论,请参阅下面的常见问题解答)。replace并且在Command go: 主模块和构建列表中:主模块的 go.mod 文件通过 require、replace 和 exclude 语句定义了 go 命令可用的精确包集。通过以下 require 语句找到的依赖模块也有助于定义该组包,但仅通过其 go.mod 文件的 require 语句:依赖模块中的任何替换和排除语句都将被忽略。因此,replace 和 exclude 语句允许主模块完全控制它自己的构建,而不受依赖项的完全控制。a构建模块时找不到包c,因此该go工具尝试解决它,尝试下载它。这就是为什么它试图将包名解释为应该以主机名开头的东西。您不需要将包重命名a为example.com/a,但必须在's中添加一个replace指令,告诉您包所在的位置。cgo.moda
随时随地看视频慕课网APP

相关分类

Go
我要回答