在本地使用带有go mod的子包

时间:2018-11-18 21:50:33

标签: go dependency-management go-modules

我在文件系统上(不在$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提取子包?

2 个答案:

答案 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"

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