为了账号安全,请及时绑定邮箱和手机立即绑定

如何访问 Go 中的嵌套模块(子模块)?

如何访问 Go 中的嵌套模块(子模块)?

Go
杨__羊羊 2023-07-17 17:52:00
去版本:1.12.9这是一个简单演示项目的结构:所以我们有一个模块domain,它包含两个模块:activity和person。我想将域与主文件 => module.go中的所有嵌套模块一起使用。我知道如何在主go.mod中导入域:module modulesgo 1.12replace modules/domain v0.0.0 => ./domainrequire modules/domain v0.0.0因此,之后可以使用domain/domain.go中的代码,但我无法访问Activity和person模块中的代码。是的,我可以手动导入嵌套模块,例如:(main go.mod):module modulesgo 1.12replace modules/domain v0.0.0 => ./domainreplace modules/domain/activity v0.0.0 => ./domain/activityrequire (    modules/domain v0.0.0    modules/domain/activity v0.0.0)但我不想手动导入所有子模块。如何配置模块以导入所有子模块的域?
查看完整描述

3 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

是的,我可以手动导入嵌套模块[...],但我不想手动导入所有子模块。如何配置模块以导入所有子模块的域?

你根本无法做到这一点。

一些背景:

  • 没有真正的“子”模块概念,所有模块都是平等的。

  • 包也一样:所有(*)包都是相等的。如果你想使用一个包,你必须导入它。

  • 文件系统中的布局并不暗示包之间有任何类型的技术关系(例如,net/http/cookiejar 与 net/http 的相关性与与 crypto/md5 的相关性一样多:一点也不)。

  • 作为模块的一部分并没有多大意义:模块只是版本控制在一起的一组包,并且不会在这些包之间添加任何其他关系。

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

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

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

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

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

  • 停止让每个包都有自己的模块。

  • 停止制作小包装。

  • 停止尝试模仿您可能在其他语言中使用的源代码布局(“架构”)。

(*) 内部和供应的软件包是一个例外,不适用于您的问题。


查看完整回答
反对 回复 2023-07-17
?
函数式编程

TA贡献1807条经验 获得超9个赞

multi-workspacego 1.18通过文件支持新功能go.work

查看完整回答
反对 回复 2023-07-17
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

我在Go 1.20中遇到了类似的情况。这是我解决问题的方法。

包裹

我在我的 Go 项目中使用了存储库作为包。该存储库使用一个子模块。

这是我的存储库my-repository/services中的 .gitmodules 文件:

//img3.sycdn.imooc.com/64b50f7e00015dbd05820145.jpg

改变

我所缺少的:
在引入工作区之后,子模块的处理方式有所不同。所以现在我需要创建一个go.work文件。需要与 go.mod 放在同一级别。

go.work

go 1.20
use ./validator/validate

用法

现在我想在我的主存储库中使用这个包。将其导入为,

//img2.sycdn.imooc.com/64b50f8a0001609e05770097.jpg

这解决了我的问题。您可以在以下位置找到文档:设置您的工作区


查看完整回答
反对 回复 2023-07-17
  • 3 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信