如何在 Go 中访问嵌套模块(子模块)?
How to access nested modules (submodules) in Go?
转到版本:1.12.9
这是一个简单的演示项目的结构:
所以我们有一个模块domain,它包含两个模块:activity和person.
我想将域与主文件中的所有嵌套模块一起使用 => 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 的代码,但是我 无法访问 的 代码]activity 和 person 模块。
是的,我可以手动导入嵌套模块,例如:
(主要 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
)
但我不想手动导入所有子模块。
如何配置模块以导入 domain 所有子模块?
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 模块可能不是你想象的那样。一个模块是集合 包版本 在一起。我怀疑是否有理由同时为包人和包域提供不同的版本。 (允许 将多个模块合二为一 repository/project,但拥有多个模块是 非常 罕见的情况,你的显然不是't).
最佳建议(按相关性排序):
- 停止让每个包都成为自己的模块。
- 停止制作小包装。
- 停止尝试模仿您可能在其他语言中使用的源代码布局(“架构”)。
(*) internal 和 vendored 软件包是一个例外,不适用于您的问题。
go 1.18 通过 go.work
文件支持新的 multi-workspace
功能。
有关详细信息,请查看 golang workspace proposal
转到版本:1.12.9
这是一个简单的演示项目的结构:
所以我们有一个模块domain,它包含两个模块:activity和person.
我想将域与主文件中的所有嵌套模块一起使用 => modules.go.
我知道如何在主 go.mod:
中导入 domainmodule modules
go 1.12
replace modules/domain v0.0.0 => ./domain
require modules/domain v0.0.0
所以之后可以使用 domain/domain.go 的代码,但是我 无法访问 的 代码]activity 和 person 模块。
是的,我可以手动导入嵌套模块,例如:
(主要 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
)
但我不想手动导入所有子模块。
如何配置模块以导入 domain 所有子模块?
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 模块可能不是你想象的那样。一个模块是集合 包版本 在一起。我怀疑是否有理由同时为包人和包域提供不同的版本。 (允许 将多个模块合二为一 repository/project,但拥有多个模块是 非常 罕见的情况,你的显然不是't).
最佳建议(按相关性排序):
- 停止让每个包都成为自己的模块。
- 停止制作小包装。
- 停止尝试模仿您可能在其他语言中使用的源代码布局(“架构”)。
(*) internal 和 vendored 软件包是一个例外,不适用于您的问题。
go 1.18 通过 go.work
文件支持新的 multi-workspace
功能。
有关详细信息,请查看 golang workspace proposal