go - 如何在 Go 中访问嵌套模块(子模块)?

标签 go go-modules

Go版本:1.12.9

这是一个简单的演示项目的结构:

enter image description here

所以我们有一个模块domain,它包含两个模块:activityperson

我想将域与主文件中的所有嵌套模块一起使用 => modules.go

我知道如何在主 go.mod 中导入 domain:

module modules

go 1.12

replace modules/domain v0.0.0 => ./domain

require modules/domain v0.0.0

所以在那之后可以使用来自 domain/domain.go 的代码,但是我无法访问 来自 activityperson 模块。

是的,我可以手动导入嵌套模块,例如:
(主要 go.mod):

module modules

go 1.12

replace modules/domain v0.0.0 => ./domain

replace modules/domain/activity v0.0.0 => ./domain/activity

require (
    modules/domain v0.0.0
    modules/domain/activity v0.0.0
)

但我不想手动导入所有子模块。

如何配置模块以导入所有子模块的

最佳答案

Yes, I could manually import nested modules [...] but I don't want to manually import all submodules. How to configure modules to import domain with all submodules ?

你根本无法做到这一点。

一些背景:

  • 没有“子”模块的真正概念,所有模块都是平等的。
  • 包相同:所有(*)包都是平等的。如果你想使用一个包,你必须导入它。
  • 文件系统中的布局并不暗示包之间存在任何类型的技术关系(例如,net/http/cookiejar 与 net/http 的关系与它与 crypto/md5 的关系一样多:完全没有)。
  • 成为模块的一部分并没有多大意义:模块只是一组版本控制在一起的包,不会在这些包之间添加任何额外的关系。

规则非常简单:如果你想导入一个包,你必须导入它。

没有神奇的通配符导入这一事实可能看起来很烦人(见下文)但可以防止意外导入:添加包不会神奇地导入它(并执行它的初始化函数!)。

在现实生活中,必须导入所有包并没有那么烦人,因为“正常”的 Go 代码不使用小包。对于被 Java/C#/PHP/Node 灌输大量文件夹和小类的“项目架构”的人来说,这是一个常见的错误:不要在 Go 中这样做。它没有帮助。它甚至经常导致循环导入和伤害。

模块也一样。 Go 模块可能不是你想象的那样。模块是控制在一起的一组包。我怀疑是否有理由同时为包人和包域提供不同的版本。 (允许在一个存储库/项目中拥有多个模块,但拥有多个模块是非常罕见的情况,您的情况显然不是。

最佳建议(按相关性排序):

  • 不要让每个包都成为自己的模块。
  • 停止制作小包装。
  • 停止尝试模仿您可能在其他语言中使用的源代码布局(“架构”)。

(*) internal 和 vendored 包是一个异常(exception),不适用于您的问题。

关于go - 如何在 Go 中访问嵌套模块(子模块)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57806081/

相关文章:

amazon-web-services - 如何将带有模块的 Go 应用程序部署到 AWS EB

go - 当我的 go.sum 已经以这种方式检查时,这个差异是什么?

go - 如何从另一个函数调用 dbmap.Insert(interface{})?

json - 如何解码 json 数据以定义明确的格式打印

go - 使Go应用程序依赖静态文件

go - 编辑多个未发布的 Go 模块的本地副本

go - 在 Cobra 命令行工具中,如何为不同的标志使用相同的变量?

go - 如何解析表单后的数组

amazon-web-services - AWS SDK 是否自动处理 session 过期?

go - 如何从 Dep 迁移到 Go 模块