在本地将子包与go mod一起使用

atp*_*atp 7 go dependency-management go-modules

我在文件系统上(不在中$GOPATH)有一个go包,名为bitbucket.org/me/awesome

~/awesome> tree
.
??? main.go
??? go.mod
??? go.sum
??? subpackageA
?   ??? main.go
Run Code Online (Sandbox Code Playgroud)

我的go.mod样子是:

module bitbucket.org/me/awesome

require (
       ... # lots of external dependencies
)

replace bitbucket.org/me/awesome => ./
Run Code Online (Sandbox Code Playgroud)

main.go顶层目录中,我调用一个子包,如下所示:

import "bitbucket.org/me/awesome/subpackageA"
Run Code Online (Sandbox Code Playgroud)

这一切似乎都很正常。go get作品。但是,当我将整个存储库克隆到其他位置(例如在Docker映像中)并go get首次运行时,出现如下错误:

package bitbucket.org/me/awesome/subpackageA: https://api.bitbucket.org/2.0/repositories/me/awesome?fields=scm: 403 Forbidden

这意味着它没有使用软件包的本地文件系统版本,即使我通过文件中的replace指令告诉了它go.mod

我究竟做错了什么?如何确保从文件系统使用子包,而不是尝试从Internet提取子包?

Vol*_*ker 8

Go没有“子包”的(实际)概念。所有软件包基本上都被平等对待。这意味着a replace bitbucket.org/me/awesome不会影响包,bitbucket.org/me/awesome/subpackageA因为它们是两个独立的不相关的包。文件夹布局不会引入subpackageA与awsome的关系,反之亦然。

因此,您需要为subpackageA添加单独的replace指令

replace bitbucket.org/me/awesome/subpackageA => ./subpackageA
Run Code Online (Sandbox Code Playgroud)

*)绝对正确:文件夹布局确实会影响命名的文件夹internal(不能从其他项目导入),命名的文件夹vendor(可能包含供应商的程序包)并在go.mod回购根目录停止搜索文件。