Golang子项目或子模块依赖项

Golang子项目或子模块依赖项,go,go-get,Go,Go Get,在Golang中,下载依赖项子模块的推荐方式是什么?我认为我的问题最好用例子来描述 示例#1: 我有一个客户端和一个服务器。我的服务器是一个API,并具有一系列其他依赖项,如数据库、消息队列、领事等。我希望我的客户端是一个轻量级软件包,用户只下载客户端所需的少量依赖项 您可以说客户机和服务器可以位于不同的存储库中。然而,它们之间也可能有一些共同的代码,如果我们遵循这种模式,它们将再次成为另一个存储库 我在想一个类似这样的结构: service/ ---> common/ ------>

在Golang中,下载依赖项子模块的推荐方式是什么?我认为我的问题最好用例子来描述

示例#1: 我有一个客户端和一个服务器。我的服务器是一个API,并具有一系列其他依赖项,如数据库、消息队列、领事等。我希望我的客户端是一个轻量级软件包,用户只下载客户端所需的少量依赖项

您可以说客户机和服务器可以位于不同的存储库中。然而,它们之间也可能有一些共同的代码,如果我们遵循这种模式,它们将再次成为另一个存储库

我在想一个类似这样的结构:

service/
---> common/
------> redis.go
------> kafka.go
---> client/
------> client.go
---> server/
------> database/
------> swagger/
------> producer/
------> etc/
示例2: 项目共享模型非常常见。如果我们有通过消息代理与公共模型进行通信的微服务,我们可能需要这样的结构

service/
---> model/
------> message.go
---> service1/
---> service2/
与其他语言的比较 我来自Scala/Java背景,不到一个月就开始使用Golang。与Scala相比,我可以用两种方式处理这个问题。让我们以为例#2

  • 将模型发布为自己的jar,并在每个服务中导入
    model.jar
  • 在sbt中使用多项目设置:
  • 我在围棋中探索了一些东西
  • 但到目前为止,他们似乎没有解决我的问题

    最后问题 在Golang解决我在示例中所述问题的推荐方法是什么


    谢谢你的帮助

    一般来说,尽量坚持一种回购协议和一种模式。将代码库拆分为多个回购协议和/或多个模块会导致成本随着时间的推移而增加。您需要在您自己的模块之间定义明确的版本依赖关系,谨慎地进行分阶段升级,等等。特别是对于中小型项目,一个回购和一个模块是最好的方式

    关于示例1中的具体要求,如果“客户机”用户不需要提取“服务器”代码是至关重要的,那么客户机和服务器必须位于单独的模块中。这些模块可以在同一回购协议中,也可以在不同的回购协议中-这没有区别。通用代码必须位于其自身的模块中,例如:

    github.com/user/myrepo/
      client/
        go.mod
      server/
        go.mod
      common/
        go.mod
    
    然后,使用客户机的模块在其
    go.mod

    require github.com/user/myrepo/client <version>
    
    需要github.com/user/myrepo/client
    
    这将拉入
    客户端
    通用
    ,但不会拉入
    服务器

    若服务器依赖于客户机是可以的,那个么您可能会使
    通用
    成为
    客户机
    的一部分,尽管我不确定这会节省多少钱

    对于示例2来说,想法是类似的-通用代码可以进入它自己的模块


    我强烈建议你阅读上的官方博客帖子


    对于带有模块的简单Go项目布局,请参见

    首先了解根本没有“子”模块或“子”包。基本上所有模块和包都是相同的。无论您是将所有代码放入一个回购协议还是多个回购协议,无论您是将代码放入一个模块还是多个模块,以及如何将代码拆分为包,都完全不重要,只要做适合您需要的事情即可。从一个repo开始,一个模块自然地为您想要做的事情建模:模块是一起版本化的包的集合,适用于服务器/客户端代码。如果一个模块是共享的,则将其作为一个项目并导入两次。例如,一个复杂的计算模块。对于共享结构,我建议使用复制或像git hook这样的自动化,在您更改服务器时将消息复制到客户端。“一点抄袭总比一点依赖要好。罗伯·派克的谚语说:”谢谢你的建议!关于common、client和server的示例结构,我正在尝试这样做。然而,当我只导入
    去获取github.com/user/myrepo/client
    时,它似乎仍然在提取包括服务器包在内的所有内容。您对我可以从哪个存储库查看此类示例有何建议?或者一篇展示如何使用这种结构的博客文章/教程?@sarindarasmi:如果客户机和服务器是不同的模块,并且客户机对服务器没有依赖性,那么只需
    要求
    -ing客户机不应该拉入服务器。举个例子,看看这个repo:--它有一堆包被包装在单独的模块中(
    find.-name go.mod
    ),如果你只是拉主要的东西,这些包将不包括在内,除非您明确要求,否则我确实获得了gocloud.dev/pubsub/rabbitpubsub
    ,它是来自的子模块之一,并且我的
    go.mod
    文件显示它只包含此依赖项。但是,整个存储库仍然是从repository@SarinMadarasmi:是的,但是你真的在乎吗?使用Go模块代理(
    GOPROXY
    )应该非常快。你可以拆分成一个单独的回购协议,这是真的important@SarinMadarasmi:下载发生在您
    开始构建时。只有程序使用的DEP进入最终二进制文件,因此其大小不会受到影响。实际上,我建议您尝试一下——使用任何在线多模块回购协议(或创建您自己的)进行测试应该需要15分钟