【问题标题】:Using subpackages with go mod locally在本地使用带有 go mod 的子包
【发布时间】:2019-04-21 07:00:44
【问题描述】:

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

【问题讨论】:

  • Yoe 似乎只有 bitbucket.org/me/awesome 的替换指令,但问题在于 bitbucket.org/me/awesome/subpackageA。不要将文件夹中的包视为子包:它不是。它是一个独立的包与“父”文件夹中的内容没有 任何关系。
  • @Volker 谢谢,这是为我解决此问题的提示(为子包添加其他 replace 行)。您想添加您的评论作为答案吗?
  • 我不太明白这个问题陈述。看来这里的所有包都在同一个bitbucket.org/me/awesome 模块中,并且同一模块中的包应该会自动找到彼此,而不需要replace 指令。
  • (另外,replace 指令仅在 modules 上作为左侧和右侧参数运行,而不是在子包或包上运行,除非包位于模块的根目录,在这种情况下,包路径和模块路径是相同的,但即便如此,replace 指令实际上是在模块级别运行的)。
  • 还有更多here 说明包如何在同一个模块中找到彼此,以及这与整个模块结构之间的关系。

标签: go dependency-management go-modules


【解决方案1】:

Go 没有(真正的)“子包”概念。所有的包裹基本上都是平等的。这意味着replace bitbucket.org/me/awesome 不会影响包bitbucket.org/me/awesome/subpackageA,因为它们是两个独立的、不相关的包。文件夹布局没有引入 subpackageA 与 awsome 的关系,或者相反 *)。

所以你需要为 subpackageA 添加一个单独的替换指令

replace bitbucket.org/me/awesome/subpackageA => ./subpackageA

*) 挑剔绝对正确:文件夹布局确实影响名为 internal 的文件夹(不能从其他项目导入)、名为 vendor 的文件夹(可能包含供应商的包)和搜索 go.mod文件在 repo 根目录处停止。

【讨论】:

    【解决方案2】:

    对于另一种方法,您可以像这样使用go.mod

    module awesome
    

    然后像这样调用子包:

    import "awesome/subpackageA"
    

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

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多