尊重部署在 Cloudfoundry 或 Heroku 上的 Gradle/Spring 应用程序的代码库因素(来自 12 因素应用程序宣言)

Respecting the codebase factor (from 12-factor app manifesto) for a Gradle/Spring app deployed on Cloudfoundry or Heroku

我的问题与 12 因素应用程序宣言的第一个因素有关:代码库。 (参见 http://12factor.net/codebase)。

TL;DR:

这个因素表明代码库和部署之间存在一对一的关系,因此在这种情况下,您不应该为两个应用程序使用相同的代码库(存储库)

我的要求:我有一个网站 Spring 应用程序和一个批处理 Spring 应用程序都共享一个公共代码,即域模型(JPA 实体 类).我需要能够共享这个通用代码。并且两个应用程序在任何时候都需要使用相同版本的通用代码

我当前的设置:我目前在 github 上有三个 "top-level" 存储库:

另请注意,域模型存储库是单独存在的(如上所述),但也嵌套在网站和批处理应用程序存储库中。我使用 git subtree pull/push 以将此域模型存储库作为目录包含在内,并在其他两个存储库中包含一个 gradle 项目。这样做的原因是 Heroku 从 repos 构建代码本身。

所有这些都非常繁琐且容易出错。

有人可以建议更好的解决方案吗?

我会将域模型捆绑在一个包中(不确定 java / gradle 代表这种捆绑的是什么,在 ruby 中它将是 gem ) 并将其作为依赖项安装在生产环境中。否则 git submodule 也是一个选项

我会将通用代码发布到 Bintray and then add that private repo to the other consumer apps and specify the common module as a dependency. This doesn't guarantee that both will depend on the same version but that could be easily managed through external processes using tools like the Maven Versions Plugin 上的私有 Maven 存储库。但您可能还想添加一个更灵活的序列化系统,以松散地耦合两个应用程序的领域模型。