繁体   English   中英

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

[英]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"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM