[英]Using subpackages with go mod locally
我的文件系统上有一个 go 包(不在$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
,
这意味着它没有使用包的本地文件系统版本,即使我在go.mod
文件中使用replace
指令告诉它。
我究竟做错了什么? 如何确保从文件系统使用子包而不是尝试从 Internet 获取?
Go 没有(真正的)“子包”的概念。 所有包基本上都被平等对待。 这意味着replace bitbucket.org/me/awesome
不会影响包bitbucket.org/me/awesome/subpackageA
因为它们是两个独立的、不相关的包。 文件夹布局不会引入 subpackageA 与 awsome 的关系,或者相反 *)。
所以你需要为 subpackageA 添加一个单独的替换指令
replace bitbucket.org/me/awesome/subpackageA => ./subpackageA
*) 绝对正确性的挑剔:文件夹布局确实会影响名为internal
文件夹(不能从其他项目导入),对于名为vendor
文件夹(可能包含 vendored 包)和搜索go.mod
文件在 repo 根停止。
对于另一种方法,您可以像这样使用go.mod
:
module awesome
然后像这样调用子包:
import "awesome/subpackageA"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.