我有一个存储在 Git 中的 Maven 3 多模块项目(约 50 个模块)。多个开发人员正在处理并构建此代码,我们还有自动构建机器,每次推送时都会运行冷构建。
大多数单独的更改日志会在相当少的模块中更改代码,因此每次更改都重新构建整个源代码树是浪费时间。但是,我仍然希望运行父项目构建的最终结果与构建整个代码库相同。而且我不想开始手动对模块进行版本控制,因为这将成为交叉版本更新的噩梦。
我想做的是添加一个插件,它拦截构建或安装中的某个步骤,并获取模块内容的哈希(理想情况下从 Git 中提取),然后在共享二进制存储库中查找存储在该哈希下的工件。如果找到了,它会使用该工件,甚至不执行完整的构建。如果它在缓存中找不到任何内容,它会正常执行构建,然后将其工件存储在缓存中。重建任何具有依赖项(直接或临时)的模块也很好,这些模块本身就有缓存未命中。
有没有什么东西已经做了这样的事情了?如果没有,将它添加到 Maven 的最干净的方法是什么?似乎插件可能能够完成它,但是对于几件我很难找到正确的方式来附加到 Maven。具体来说:
- 您如何拦截“安装”目标以检查缓存,并且仅在缓存未命中时调用模块的“本机”安装目标?
- 插件应该如何将状态从一个模块传递到另一个模块,以通过更改强制重建依赖关系?
我也愿意接受完全不同的方法来实现相同的最终结果(更少的冗余构建),尽管解决方案越激烈,它在短期内对我的价值就越小。