代码人生

Monorepos很受欢迎,但也有争议,是否应该为所有代码采用一个代码库?

代码人生 http://www.she9.com 2018-08-06 14:31 出处:网络 编辑:@技术狂热粉
Monorepos很受欢迎,但也有争议,是否应该为所有代码采用一个代码库?

Monorepos(将所有代码放在一个存储库中)是一个相当有争议的话题,在软件开发领域有许多有趣的原因。对于许多开发人员来说,将每一行代码存储在一个中央存储库中会让他们感到一身冷汗,他们不得不在一段时间内躺下来与这个想法进行斗争。这是可以理解的,当考虑到单块源代码存储库名声不好。

Monorepos的问题


除了面对大规模的monorepos的潜在技术限制外,团队还会遇到超过多个gb的单个源控制系统的性能问题。也可以考虑新的开发人员或新手。在登录过程中,他们面临着一个巨大的代码库需要解决,而不是得到一个更小的存储库的稳定介绍。


其他问题也出现在单个中央存储库中,例如管理和限制访问控制以及将monorepo集成到现有的构建过程中。这些都很大程度上依赖于项目、团队和组织的规模,但值得庆幸的是,这些都可以得到相应的解决。


使用一个源代码控制系统组织您的代码库是很棘手的,但是这个概念并不比处理与多个存储库相关的问题更不可思议。强制标准化是一个问题——尤其是在规模上——而且代码甚至可能变得太复杂而无法阅读。工作和努力最终被重复。最重要的是,当涉及这么多源存储库时,没有人能够从头到尾地理解平台。


作为作为服务咨询项目DevOps的一部分,我鼓励与我们合作的公司采用一个用于工具、培训材料和服务之间共享的其他依赖项的中央代码库。在可能的情况下,我们会挑选或合并其他公司——这是一个重大举措,目的是促使公司完全从multi迁移到monorepos。


因此,当涉及到存储库时,两个方向都涉及到很多复杂的问题。

不同类型的单个源代码存储库


基本上有两种类型的monorepos:


大的repos包含了公司的所有代码


特定于项目的单体,如Babel、React或Symfony,它们结合了一个库中的小的官方相互依赖的模块


Awesome-monorepo包含了大量的monorepo工具,这些工具正在野外使用。像谷歌(被称为Bazel)、Facebook (Buck)、推特(Twitter)和Foursquare(他们都使用了Pants)这样的巨大的monorepos,已经获得了统一版本控制的好处和一个编码真理的单一来源。Babel、Symfony和React都是值得注意的项目单体,它们降低了维护人员的复杂性,同时仍然为最终用户提供易于更改的模块化。


在一个集中系统中管理代码可以大大简化模块化软件项目的开发过程,比如基于微服务的基础设施。单块源代码存储库都是关于快速移动和更有效地实现项目/组织目标。简单地说,monorepos增加了开发人员的生产力。


在这个关键时刻,需要注意的是,单个源代码存储库或monorepo绝不意味着整体软件设计。这往往是许多公司不采用它们的主要原因之一,但这两者并不一定要同时进行。


如前所述,我已经促使我们咨询的所有公司开始采用这种方法的一些元素。在现有流程中实现monorepo并不容易,但也不是不可能的。我从一个单独的源测试库开始,该库包含在每个公司开发管道的核心中使用的所有中心工具和资源。引入这样一个测试库,使我们离实现组织单反又近了一步。


在中央库中,我还强制执行高级别的测试覆盖率,目标是达到最佳的95%。这让我一举两得。一个单独的中央存储库确保测试一致性,并帮助实现高测试速率级别。从那时起,就有可能开始慢慢地淘汰其他人员,并克服团队中涉及的一些焦虑。

最佳实践Monorepos


优化单个源代码库的指南:


将您的monorepo组织为单个树,其中包含一些或多或少类似于根目录的子目录;


将命名约定、标准和策略作为无序的monorepo进行处理是很可怕的;


你的monorepo的根应该包含很少的内容(自述和策略);


子目录可以作为团队或项目名称空间—这取决于组织的大小;


通过单个强(包含修订或版本控制号的文件路径)标识每个源文件。


最好将《monorepo》视为一种学习工具。用它来分享信息、训练材料和例子,而且用一种你在应用程序里无法做到的方式。对于已经采用了开放和协作的工作环境和文化的DevOps组织来说,单一的源代码存储库是最有效的。

您的团队将花费在迁移到单块代码基上的时间和精力的投资回报将在改进的生产力和更好的质量代码中多次实现。你还在等什么?


附录:

            优点和缺点

            看来已经有不少人正在使用monorepo,那么monorepo有什么优点呢。

            l 单个的lint,build,test和release流程

            l 统一的地方处理issue

            l 不用到处去找自己项目的repo

            l 方便管理版本和dependencies

            l 跨项目的操作和修改变得容易

            l 方便生成总的changelog

            缺点呢

            l repo的体积变得很大

            l 安全问题,如何管理权限

            l ??

            工具

            Lerna和Builder这两个工具都可以帮助你管理monorepo。


请关注公众号:程序你好
0

精彩评论

暂无评论...
验证码 换一张
取 消