问题描述
在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:https://www.scala-sbt.org/1.x/docs/Multi-Project.html中使用多项目设置。
我在Go中探索的一些事情
- https://blog.gopheracademy.com/advent-2015/vendor-folder/
- https://github.com/golang/go/wiki/Modules#faqs--multi-module-repositories
但是到目前为止,他们似乎还不能解决我的问题
最终问题
谢谢您的帮助!
解决方法
通常,请尽量坚持使用一个存储库和一个模块。将代码库拆分为多个存储库和/或多个模块会导致成本随着时间的推移而增长。您需要在自己的模块之间定义明确的版本依赖性,仔细进行分阶段升级,等等。特别是对于中小型项目,最好使用一个仓库和一个模块。
关于示例1 中的特定要求,如果“客户端”用户不要拉“服务器”代码很关键,则客户端和服务器必须位于单独的模块中。这些模块可以在相同的仓库中,也可以在不同的仓库中-这与Go无关。通用代码必须位于其自己的模块中,例如:
github.com/user/myrepo/
client/
go.mod
server/
go.mod
common/
go.mod
然后,使用您的客户端的模块将在其go.mod
中包含:
require github.com/user/myrepo/client <version>
这将拉入client
和common
,而不是server
。
如果服务器可以依赖客户端,则可以将common
纳入client
的一部分,尽管我不确定这样做会节省很多。
对于示例2 ,这个想法很相似-通用代码可以放入其自己的模块中。
我强烈建议您阅读Using Go Modules上的官方博客文章。
有关带有模块的简单Go项目布局,请参见this post