【发布时间】:2019-04-21 07:00:44
【问题描述】:
我的文件系统上(不在$GOPATH 中)有一个名为bitbucket.org/me/awesome 的go 包。
~/awesome> tree
.
├── main.go
├── go.mod
├── go.sum
├── subpackageA
│ └── main.go
我的go.mod 看起来像:
module bitbucket.org/me/awesome
require (
... # lots of external dependencies
)
replace bitbucket.org/me/awesome => ./
在我的顶级目录的main.go 中,我调用如下子包:
import "bitbucket.org/me/awesome/subpackageA"
这一切看起来都很正常。 go get 有效。但是,当我将整个存储库克隆到其他地方(比如在 Docker 映像中)并第一次运行 go get 时,我会收到如下错误:
package bitbucket.org/me/awesome/subpackageA: https://api.bitbucket.org/2.0/repositories/me/awesome?fields=scm: 403 Forbidden,
这意味着它没有使用包的本地文件系统版本,即使我在go.mod 文件中告诉它使用replace directive。
我做错了什么?如何确保从文件系统使用子包,而不是尝试从 Internet 获取?
【问题讨论】:
-
Yoe 似乎只有 bitbucket.org/me/awesome 的替换指令,但问题在于 bitbucket.org/me/awesome/subpackageA。不要将文件夹中的包视为子包:它不是。它是一个独立的包与“父”文件夹中的内容没有 任何关系。
-
@Volker 谢谢,这是为我解决此问题的提示(为子包添加其他
replace行)。您想添加您的评论作为答案吗? -
我不太明白这个问题陈述。看来这里的所有包都在同一个
bitbucket.org/me/awesome模块中,并且同一模块中的包应该会自动找到彼此,而不需要replace指令。 -
(另外,
replace指令仅在 modules 上作为左侧和右侧参数运行,而不是在子包或包上运行,除非包位于模块的根目录,在这种情况下,包路径和模块路径是相同的,但即便如此,replace指令实际上是在模块级别运行的)。 -
还有更多here 说明包如何在同一个模块中找到彼此,以及这与整个模块结构之间的关系。
标签: go dependency-management go-modules