我在文件系统上(不在$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提取子包?
答案 0 :(得分:6)
Go没有“子包”的(实际)概念。所有软件包基本上都被平等对待。这意味着replace bitbucket.org/me/awesome
不会影响软件包bitbucket.org/me/awesome/subpackageA
,因为它们是两个独立的不相关的软件包。文件夹布局不会引入subpackageA与awsome的关系,反之亦然。
因此您需要为subpackageA添加一个单独的replace指令
replace bitbucket.org/me/awesome/subpackageA => ./subpackageA
*)绝对正确:文件夹布局确实会对名为internal
的文件夹(不能从其他项目导入),对于名为vendor
的文件夹(可能包含供应商的软件包)产生影响,并进行搜索go.mod
文件在存储库根目录停止。
答案 1 :(得分:3)
对于另一种方法,您可以像这样使用 go.mod
:
module awesome
然后像这样调用子包:
import "awesome/subpackageA"