去版本:1.12.9
这是一个简单演示项目的结构:
所以我们有一个模块domain,其中包含两个模块:activity and person.
我想将域与主文件中的所有嵌套模块一起使用=>模块.go.
我知道如何导入domain主要在go.mod:
module modules
go 1.12
replace modules/domain v0.0.0 => ./domain
require modules/domain v0.0.0
所以之后可以使用代码域名/domain.go, but I 无法访问代码来自activity and 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与所有子模块?
是的,我可以手动导入嵌套模块[...]
但我不想手动导入所有子模块。
如何配置模块以导入所有子模块的域?
你根本无法做到这一点。
一些背景:
- 没有真正的“子”模块概念,所有模块都是平等的。
- 包也一样:所有(*)包都是相等的。如果你想使用一个包,你必须导入它。
- 文件系统中的布局并不意味着包之间有任何类型的技术关系(例如,net/http/cookiejar 与 net/http 的相关性与它与 crypto/md5 的相关性一样多:一点也不)。
- 作为模块的一部分并没有多大意义:模块只是版本控制在一起的一组包,并且不会在这些包之间添加任何其他关系。
规则非常简单:如果你想导入一个包,你就必须导入它。
事实上,没有神奇的通配符导入可能看起来很烦人(见下文),但可以防止意外导入:添加包不会神奇地导入它(并执行其初始化函数!)。
在现实生活中,必须导入所有包并不那么烦人,因为“正常”Go 代码不使用小包。对于那些被带有大量文件夹和小类的 Java/C#/PHP/Node“项目架构”灌输的人来说,这是一个常见的错误:不要在 Go 中这样做。这没有帮助。它甚至常常导致循环导入并造成伤害。
模块也一样。 Go 模块可能不是你想象的那样。一个模块是一个set包数版本化的 together。我怀疑是否有理由同时为包人和包域提供不同的版本。 (这是allowed在一个存储库/项目中拥有多个模块,但拥有多个模块是一种very罕见的情况,你的显然不是)。
最佳建议(按相关性排序):
- 停止让每个包都有自己的模块。
- 停止制作小包装。
- 停止尝试模仿您可能在其他语言中使用的源代码布局(“架构”)。
(*) 内部和供应的软件包是一个例外,不适用于您的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)