单存储库(Monorepos)不仅仅适用于大公司。事实上,通过让开发人员站在同一战线,单存储库可以为前端开发团队带来好处。
译自 The Case for (and Against) Monorepos on the Frontend,作者 Loraine Lawson 是一位资深的技术记者,她报道了 25 年的数据集成到安全性等技术问题。在加入 The New Stack 之前,她担任银行技术网站 Bank Automation News 的编辑。
尽管单存储库(monorepo)在目前仍然主要是早期采用者的领域,但使用单存储库而不是多存储库的兴趣日益增长。
当 Vercel 添加了对单存储库的支持后,我们想知道单存储库如何提升前端开发者的效率,所以我们采访了 Nrwl 公司的联合创始人兼 CTO Victor Savkin,该公司开发了一个名为 Nx 的单存储库/持续集成工具。Nrwl 也是开源单存储库工具 Lerna 的维护者。
首先,理解什么是单存储库很重要。是的,它是一个网项目或应用的单个存储库,但这并不意味着单存储库就是一个包含所有代码的庞然大物。单存储库是一种使用其他方法会变得一团糟,使用之后会井井有条的方法,就像我的政府老师常说的那样。Savkin 说,像 NX、Lerna 和 TurboRepo 这样的单存储库工具有助于在存储库中建立秩序。
“它是一种技术解决方案,用于解决人际间的问题,即降低协作的成本。” Savkin说。 “这就是为什么单存储库在影响力方面更类似于 GitHub,而不是捆绑器之类的东西,因为捆绑器是一种技术问题。使用单存储库,它必须快速完成所有这些操作,但影响更多的是......现在团队可以更快地协作,员工可以更快地交付东西。”
他还补充说,团队的认可非常重要。
“基本上,单存储库大大降低了协作的成本。”他说。“这是它的主要优势,你基本上希望将协作成本降低到更低的水平。”
事实上,协作非常关键,以至于如果一个组织有两个很少互动的单独的开发团队——可能是因为并购——那么最好保持它们分开,而不是转向单存储库。
Savkin 将单体开发比作一条没有交通信号灯或法规的道路——他说,人们就像非常疯狂地在道路上骑行,但是只要使用道路的人很少,这可能不是问题。但是当道路开始出现大量交通时,就会导致事故。为了解决这个问题,创建了多条道路(多存储库),以确保交通不会相互碰撞。
“我们有多条道路。我有自己的私人道路,在我自己的私人道路上,我以特定的方式驾驶,我不希望任何人告诉我如何驾驶,”他说,不过他补充说“将这个私人道路集成到更大的系统中很困难。”
单存储库提供了一个替代方案,其中有交通法规和停止标志,这使集成和扩展更容易。
“一个存储库不仅是一个单元,还有多个单元,单元之间有明确的关系,”Savkin 解释道。
单存储库不仅仅适用于企业应用和谷歌这样的大公司,Savkin说。但就目前而言,多存储库倾向于是最常见的方法,每个业务线或功能都有自己的存储库。以银行为例,其网站或应用程序可能有信用卡部分和汽车贷款部分。但是,如果需要在部门之间共享一条通用消息、函数甚至只是通用设计更改,该怎么办?他说,多存储库会使这更困难。
“现在我需要与团队A、团队B进行协调。”Savkin说。“在多存储库的情况下,这可能需要几个月的时间。”
他补充说,在单存储库中,只需一天的时间就可以轻松进行这一更改。它还使跨开发团队共享组件和库成为可能。
根据总部位于旧金山的在线表单公司Jotfrom的前端架构师兼工程主管Berkay Aydin的说法,单存储库帮助该公司减少了前端的技术债务。上周,Aydin撰文介绍了该公司向前端单存储库的转变。
“我们不再有多个配置或构建过程。” Aydin写道。“现在,我们可以确定每个应用程序都使用相同的配置。例如,如果我们更新浏览器支持,我们知道公司的每个部分都具有相同的浏览器支持。”
他补充说,使用pnpm
工作区功能和一些内部样板可以在几秒钟内轻松共享代码。Aydin列出的其他优势包括:
- 常见的开发环境,使创建通用命令更加容易;
- 对新员工的更好入职培训;
- 更容易的重构;
- 缩短总体构建时间;
- 以及依赖项意识,因为开发人员可以看到应用程序和库之间的连接关系。
Aydin 还分享了单存储库的劣势以及他的团队如何解决这些劣势。他提到的劣势是:
- 将现有存储库迁移到单存储库很困难;
- 如果源存储库正在积极开发,进行关键更改意味着需要在周末或非高峰时间工作;
- 管理构建队列;
- 难以调试的缓存;
- 可以预见的,对开发人员的约束更多。他写道,在单个存储库上尝试新技术更容易。
Savkin 承认迁移到单存储库可能很困难,但这不是技术问题,而是组织问题。
“更困难的部分是说:'嗯,现在我能重新设计应用程序,以便利用单存储库工具吗?' - 例如,将其拆分得更细,引入更多分区或共享更多代码。”他说。“这更难,因为这需要架构思维。从机械上说,我有两个应用程序,我想把它们放在同一个单存储库中并共享一个组件——这很琐碎;你可以在一天之内完成。”