猿问

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

我的文件系统上有一个$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。


我究竟做错了什么?我如何确保子包是从文件系统中使用的,而不是试图从互联网上获取的?


慕标5832272
浏览 147回答 2
2回答

拉丁的传说

Go 没有(真正的)“子包”概念。所有包裹基本上都是平等对待的。这意味着 areplace bitbucket.org/me/awesome不会影响包bitbucket.org/me/awesome/subpackageA,因为它们是两个独立的、不相关的包。文件夹布局不会引入 subpackageA 与 awsome 的关系,反之亦然 *)。所以你需要为 subpackageA 添加一个单独的替换指令replace bitbucket.org/me/awesome/subpackageA => ./subpackageA*) 挑剔绝对正确性:文件夹布局确实影响命名文件夹internal(不能从其他项目导入),命名文件夹vendor(可能包含销售包)和搜索go.mod文件停止在 repo 根目录。

慕盖茨4494581

对于另一种方法,您可以go.mod这样:module awesome然后像这样调用子包:import "awesome/subpackageA"
随时随地看视频慕课网APP

相关分类

Go
我要回答