16

我有一个位于我的文件系统($GOPATH不在bitbucket.org/me/awesome.

~/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,

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

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

4

2 回答 2

16

Go 没有(真正的)“子包”概念。所有的包裹基本上都是平等的。这意味着 areplace bitbucket.org/me/awesome不会影响包bitbucket.org/me/awesome/subpackageA,因为它们是两个独立的、不相关的包。文件夹布局没有引入 subpackageA 与 awsome 的关系,或者相反 *)。

所以你需要为 subpackageA 添加一个单独的替换指令

replace bitbucket.org/me/awesome/subpackageA => ./subpackageA

*) 挑剔绝对正确:文件夹布局确实会影响命名文件夹internal(不能从其他项目导入)、命名文件夹(可能包含供应商的包)和在 repo 根目录处 vendor搜索文件。go.mod

于 2018-11-19T09:28:43.700 回答
3

对于另一种方法,您可以go.mod这样:

module awesome

然后像这样调用子包:

import "awesome/subpackageA"

https://golang.org/doc/code.html

于 2020-12-30T17:43:02.387 回答