Golang子项目或子模块依赖性

问题描述

在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

  1. 将模型发布为自己的jar,并在每个服务中导入model.jar
  2. 在sbt:https://www.scala-sbt.org/1.x/docs/Multi-Project.html中使用多项目设置。

我在Go中探索的一些事情

  1. https://blog.gopheracademy.com/advent-2015/vendor-folder/
  2. https://github.com/golang/go/wiki/Modules#faqs--multi-module-repositories

但是到目前为止,他们似乎还不能解决我的问题

最终问题

在Golang中解决我在示例中提到的问题的推荐方法是什么?

谢谢您的帮助!

解决方法

通常,请尽量坚持使用一个存储库和一个模块。将代码库拆分为多个存储库和/或多个模块会导致成本随着时间的推移而增长。您需要在自己的模块之间定义明确的版本依赖性,仔细进行分阶段升级,等等。特别是对于中小型项目,最好使用一个仓库和一个模块。

关于示例1 中的特定要求,如果“客户端”用户不要拉“服务器”代码很关键,则客户端和服务器必须位于单独的模块中。这些模块可以在相同的仓库中,也可以在不同的仓库中-这与Go无关。通用代码必须位于其自己的模块中,例如:

github.com/user/myrepo/
  client/
    go.mod
  server/
    go.mod
  common/
    go.mod

然后,使用您的客户端的模块将在其go.mod中包含:

require github.com/user/myrepo/client <version>

这将拉入clientcommon,而不是server

如果服务器可以依赖客户端,则可以将common纳入client的一部分,尽管我不确定这样做会节省很多。

对于示例2 ,这个想法很相似-通用代码可以放入其自己的模块中。


我强烈建议您阅读Using Go Modules上的官方博客文章。

有关带有模块的简单Go项目布局,请参见this post