我的文件系统上有一个$GOPATH名为bitbucket.org/me/awesome.~/awesome> tree.├── main.go├── go.mod├── go.sum├── subpackageA│ └── main.go我的go.mod样子:module bitbucket.org/me/awesomerequire ( ... # 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。我究竟做错了什么?我如何确保子包是从文件系统中使用的,而不是试图从互联网上获取的?
2 回答
拉丁的传说
TA贡献1789条经验 获得超8个赞
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
TA贡献1850条经验 获得超11个赞
对于另一种方法,您可以go.mod
这样:
module awesome
然后像这样调用子包:
import "awesome/subpackageA"
- 2 回答
- 0 关注
- 146 浏览
添加回答
举报
0/150
提交
取消