我不希望将它们作为子文件夹放在同一个仓库中,因为每个都有自己的依赖和配置文件,而且我也不想让它们的提交混在一起。
好的,你不想让它们的提交混在一起。
我不想将它们留作单独的仓库,因为我在父仓库上有问题,可能需要在后端和移动端仓库上做出修改,我想在同一个分支上解决问题...
...除非你确实想让它们的提交混在一起。 ;)
我哪里错了?
如果你经常需要同时更改多个仓库,你可能需要考虑它们是否实际上是单个仓库。有两种处理这种情况的好方法,但子仓库不是其中之一。
一个仓库
将它们合并成一个单一的代码库。如果它们都是同一项目的一部分,并且它们之间存在相互依赖的更改,则它们是一个单一的代码库。它们可以是具有自己配置和依赖项的子文件夹,这对于需要共同开发但需要进行分发的大型项目来说是相当常见的。
缺点是开发人员很可能会利用此功能,将客户端代码与后端紧密绑定。如果项目之间没有明确的分离,则后端API可能会变得松散。客户端更有可能利用未记录的后端功能,使整个系统变得脆弱且难以更改。添加新的客户端(例如tharwa-api
)将变得更加困难。
如果有第三方为tharwa-backend
编写自己的客户端,则他们处于劣势。 client
和 web
处于特权位置,它们可以与 backend
同步。第三方开发者就没有那么幸运了,你的项目将更难贡献。
一旦将项目组合在一起,您就不太可能再将它们分开。
许多仓库,严格的依赖关系。
另一种方法是通过每个仓库将其他仓库视为正常依赖项来更严格地执行各个部分之间的封装。在您的login
示例中...
- 在
backend
上实现、测试和提交更改。
- 发布
backend
,即使只是用于内部分发。
- 针对新的
backend
测试web
和mobile
,以确保向后兼容性得到维护。
- 一些依赖机制允许直接从Git仓库获取依赖关系。
- 使
web
和mobile
更新其backend
依赖项并使用新功能。
现在开发人员更难作弊了。发布的额外步骤(即使只需一两分钟)提供了一个“空气间隙”。backend
必须开发自己的单元、集成和验收测试;它不能依靠客户端为它们完成这些工作。客户端必须更加健壮,并更加严格地遵守后端API。通过解耦后端和客户端,更容易对每个部分的内部进行重大更改。
开发人员仍然可以进行锁步更改,但现在它们是明确的。使它们明确会阻止它们的使用,防止开发人员变得懒惰。
但这确实增加了一些额外的开销。后端更改必须经过充分的思考、开发和文档化。后端API必须更加完善和健壮。客户端必须更加密切地遵守API。所有这些都是良好的软件工程,将在中长期内加快速度。
为什么不使用子模块?
子模块提供了单个存储库的大部分优点,但增加了一个令人困惑的功能。它还提供了单个存储库的所有缺点,再加上一个:缺乏协调。
在单个存储库中,一个提交就是一个提交。一个分支就是一个分支。而使用子模块,则很难通过查看单个存储库来确定哪些提交必须在所有存储库之间进行协调。这些协调提交可以在任何时候发生,没有警告,并且很难知道。
您需要一些程序和机制来跟踪和协调这些提交。您可以通过试错自己构建所有内容,也可以使用现有的发布依赖系统。
你选择哪种取决于你的项目。然而,我建议你尝试完全解耦,并看看效果如何。这有助于促进良好的软件工程实践。而且你总是可以稍后将它们重新组合在一起,反过来则很困难。