当前位置: 首页 > 科技观察

2021年管理Monorepo代码库的11大工具

时间:2023-03-12 11:15:07 科技观察

今天,许多工具可以在20个不同的文件夹中运行“npminstall”和“npmrunbuild”。然而,并不是所有的工具都有助于正确的monorepo。促进适当的整体开发意味着解决诸如为分离模块运行测试和构建过程、能够独立于项目发布模块以及管理更改对项目中每个受影响的依赖模块的部分影响等挑战。挑战清单还在继续,甚至是“微不足道”的事情,比如如何管理问题和PR,随着开发规模的扩大,这些事情可能会变得困难。请注意,monorepo不是一个单一的应用程序(!)——它不是一次性构建或部署的,它是一组单独开发的应用程序。什么是单体仓库?10月5日国庆期间,友达发布了vue3.0完整源码,同样采用了monorepo管理模式。看来monorepo确实有其独特的优势。Monorepo是一种将多个包放在一个repo中的代码管理模式,摒弃了传统的多包多repos的模式。目前Babel、React、Angular、Ember、Meteor、Jest等众多开源项目都采用这种模式来管理代码。需要解决的问题是多个repos难以管理,编辑器需要打开多个项目;当一个模块升级时,依赖于被修改模块的其他模块需要手动升级,容易遗漏;公共npm包重复安装,占用硬盘容量大,比如打包工具webpack每个项目都会安装一次;对新手友好,一条命令即可完成所有模块的依赖安装,整个项目模块不需要去各个仓库找;所有包代码引起的问题都集中在一个项目中,单个项目规模较大;所有包代码对所有人可见,无权限管理;在这篇评论中,我收集了一些世界上最好的工具来构建一个“monorepo”,你可以在一个项目中构建多个模块,并且具有良好的开发者体验并且可以扩展。此列表未进行排名,旨在根据每个工具的优点概述每个工具的优势。希望这可以帮助您节省时间并找到合适的工具。欢迎在下方评论,分享自己的经历。1.YarnWorkspacesYarnWorkspaces的目标是简化使用monorepos的工作,以更明确的方式解决yarnlink的主要用例之一。您的依赖项可以链接在一起,这意味着您的工作区可以相互依赖,同时始终使用最新的代码。这也是一个比yarnlink更好的机制,因为它只影响你的工作区树而不影响你的整个系统。工作区在一些方面有所帮助,使其成为一款出色的单人装备。它设置了单个node_modules,无需在项目中的不同包中复制或克隆依赖项。您所有的项目依赖项都将安装在一起,从而为Yarn提供更多空间来更好地优化它们。Yarn将使用单个锁定文件,而不是为每个项目使用不同的锁定文件,这意味着更少的冲突和更容易的审查。它允许您更改其中一个包的代码,并让使用它的其他包立即看到这些更改。对一个包源代码的任何修改都会立即应用于其他包。因此,YarnWorkspaces是一个非常强大的组合,可以与列表中的几乎所有工具一起使用,尤其是像Bit、Nx和Lerna这样的工具,作为monorepo管理抽象的较低层。但是,您也可以直接使用工作区进行发布。当一个工作区被打包到一个存档中时,它会动态地替换任何工作区:依赖包的版本,因此您可以将生成的包发布到远程注册表而无需运行中间步骤-消费者将能够像任何其他人一样使用已发布的工作区其他包。凉爽的!2.BitBit是构建模块化项目的下一代工具。这是一种全新且令人兴奋的单一存储库方法,其中由同一项目(相同的Bit工作区)管理的模块实际上分布在不同的范围内,而与存储库无关。Bit让您以完全解耦的方式拆分模块的开发,享受简单、整体的开发体验来协调一切。使用bit,您可以解耦项目中的组件,以便每个组件都独立开发、构建、测试和发布。每个组件都是使用可扩展和可重用的特殊环境开发和构建的,因此您可以快速自定义和重用它们。Bit的工作区管理项目中所有组件之间的关系。当您对任何组件进行更改时,Bit会单独构建和测试它,并将更改传播到依赖关系图中。组件可以作为独立包分批发布到NPM和/或bit.dev平台,用于协作、消费和文档。Bit的UI可以帮助您查看您的monorepo的开发状态。在您编写代码时,每个组件都会被记录、测试、构建等,您可以通过实时反馈和热重新加载来可视化正在发生的事情。Bit提供了一个解耦的开发环境——可重用和可定制的模块,将独立组件整个生命周期所需的不同服务配置和“捆绑”在一起,例如编译、捆绑、测试、打磨、文档等。Bit的工作区以简单而全面的方式分离组件开发MasterComponentDiagrams-Bit定义、管理并帮助您利用项目中所有组件之间的关系。图形驱动的构建——当您对组件进行更改时,Bit会自动检测依赖它的其他组件并“知道”仅构建依赖组件的受影响图形。“图形驱动的构建”还意味着如果组件被标记为新的发布版本(在导出到Bit的云之前),Bit不仅会在每个受影响的组件上运行构建,而且会确保为它们标记一个新版本。独立测试和构建——每个组件都是在项目外独立构建和测试的,因此您可以准确地看到更改的影响。组件构建管道-您可以在可重复使用的管道中构建作业,该管道可应用于项目中的所有组件或跨所有项目。批量发布——在Bitmonorepo中开发的每个组件都可以作为一个独立的包发布。Bit消除了为每个组件配置“package.json”和其他设置文件的所有开销。你所要做的就是运行'bittag',这样Bit会自动修补所有修改的组件(支持semver规则),然后批量发布更改。可重复使用的文档模板-每个组件都使用可重复使用和可自定义的模板进行记录,Bit会自动为您完成大部分工作。在MDX工作?也许添加一些可视化示例?没问题。独立渲染的组合——每个组件完全独立渲染,完全在项目之外,渲染的视觉效果(随着代码的编写热重新加载)成为每个组件文档的一部分。3.NXNX是一套用于monorepos的高级可扩展开发工具,非常强调现代全栈网络技术。空NXmonorepoNX的目标是通过CLI(带有编辑器插件)提供整体开发体验,具有受控代码共享和一致代码生成的功能。它还提供增量构建,因此它不会在您每次提交时重建和重新测试所有内容,从而加快构建时间。借助Nx,您可以使用自己喜欢的框架并集成您可能已经在使用的现代工具。例如,NX允许您使用与Cypress、Jest、Typescript、Prettier等开箱即用的集成。NX团队还提供NXCloud,它可以帮助使用NX的团队通过智能计算内存和更快的云端构建来更快地交付。4.RushRush是微软+开源的一个强大的monorepo基础设施,它的目的是帮助你在一个仓库中构建和发布多个包。登陆页面和一些组件,两个项目,一个存储库rush的一些关键功能包括单个NPM安装(也适用于Yarn和pnpm),因此您可以将所有项目的所有依赖项安装到一个公共文件夹中,重建一个精确的“node_modules”"具有独立符号链接的每个项目的文件夹。这也有助于确保没有幻影依赖项,因此您不会意外导入package.json中缺少的库,或者在node_modules中找到10个重复的库依赖项副本。Rush交互式CLI很好自动本地链接意味着您的所有项目将自动相互符号链接,当您进行更改时,您可以看到下游效果而无需发布任何内容,也没有任何npm链接的麻烦。Rush独特的安装策略为您的所有项目生成一个收缩/锁定文件,以便快速安装。Rush将检测您的依赖关系图并以正确的顺序构建您的项目,因此如果两个包之间没有直接依赖关系,Rush将作为单独的进程并行构建它们。如果您只打算使用存储库中的几个项目,Rush提供子集和增量构建,所以赶紧重建——只对上游依赖项进行干净构建。进行更改后,rushrebuild--from只会清理受影响的下游项目。虽然rushbuild提供了强大的跨项目增量构建,但Rush甚至可以通过分离项目的版本来处理循环依赖。当你要发布的时候,Rush支持批量发布,所以它会检测哪些包发生了变化,自动跳转到所有相关的版本号,并在每个文件夹中运行npmpublish。Rush还有助于实施和执行发展政策。例如,在创建PR时,您可以要求开发人员提供受影响项目的主要/次要/补丁日志条目,然后这些条目将在发布时聚合到一个单独的变更日志文件中。它还可以帮助您执行预发布审查、特定依赖版本等操作。5.LernaLerna(以多头兽Hydra的家命名)是一个“用于管理具有多个包的JavaScript项目的工具”。Lerna的创建是为了解决Babel的多包问题,以优化使用git和npm管理多包存储库的工作流程。它本质上是一个工具和脚本,可以在仓库中的一个Git中高效地管理和发布多个独立版本的包。my-lerna-repo/package.jsonpackages/package-1/package.jsonpackage-2/package.jsonLerna的两个主要命令是lernabootstrap和lernapublish。bootstrap将repo中的依赖关系连接在一起,而publish将帮助发布任何更新的包。您可以采用两种模式之一管理项目:固定模式或独立模式。固定模式Lerna项目在单个版本行上运行,该版本行作为版本密钥存储在项目根目录的lerna.json文件中。当你运行lernapublish时,如果一个模块自上次发布以来已经更新,它将更新到你发布的新版本。这是Babel目前使用的模式。Lerna与YarnWorkspacesStandalone模式的示例Lerna项目允许维护者彼此独立地增加包的版本,并且在每次发布时,您将收到每个已更改的包的提示,以指定它是一个补丁,小的,重大或自定义更改。独立模式允许您更具体地更新每个包的版本,这对一组包有意义。“lerna.json”文件是与包含package.json的目录匹配的glob列表,这就是lerna识别“叶”包的方式(与管理整个repo的开发依赖项和脚本相反)。示例:{"version":"1.1.3","npmClient":"npm","command":{"publish":{"ignoreChanges":["ignored-file","*.md"],"消息":"杂务(发布):发布","注册表":"https://npm.pkg.github.com"},"bootstrap":{"ignore":"component-*","npmClientArgs":["--no-package-lock"]}},"packages":["packages/*"]}即使你不打算发布到NPM,Lerna仍然可以帮助管理版本管理和常见的开发任务单一仓库。6.Bazel构建系统(Google)Google推出了Bazel构建系统,它是一种类似于Make、Maven和Gradle的开源构建和测试工具,使用人类可读的高级构建语言。Bazel支持多种语言的项目,并为多个平台构建输出。它支持大型单个存储库中的大型代码库或跨多个存储库的大型代码库和大量用户。Uber开发人员使用Bazel构建他们的Go单体仓库。Uber用Go编写了大部分后端服务和库,在2018年,这些服务和库都被汇总到一个大型Gomonorepo中,现在有超过100,000个文件。Bazel允许该项目扩展、减少构建时间并支持其发展。这是一个使用Bazel作为演示的不错的小型开源项目:thundergolfer/example-bazel-monorepoBazel旨在大规模工作并支持跨分布式基础设施的增量密封构建,这对于大型代码库是必需的。借助Bazel的远程缓存,构建服务器还可以共享其构建工件。Bazel缓存所有以前完成的工作并跟踪对文件内容和构建命令的更改。只有当包或包的依赖项发生变化时,才会构建和测试包。Bazel可以在Linux、macOS和Windows上运行。Bazel可以从同一项目为多个平台构建二进制文件和可部署包,包括桌面、服务器和移动设备。支持多种语言,您可以扩展Bazel以支持任何其他语言或框架。7.Buck构建系统(Facebook)Buck是一个构建系统,它鼓励创建由代码和资源组成的小型可重用模块,支持不同平台上的各种语言。它由Facebook开发并用作FB单体的官方构建系统,并且由于被Uber开发人员等团队用来大幅缩短构建时间而获得了很多声誉。另一方面,AirbnbEng的团队将构建速度提高了50%,并将应用程序的大小减小了30%。Uber使用buck获得更好的构建结果Buck旨在构建一个monorepo,对monorepo设计的支持激发了Buck对单元格和项目的支持。Facebook的经验是,在同一个存储库中维护所有依赖项可以更轻松地确保所有开发人员都拥有正确的代码版本,并简化进行原子提交的过程。Buck常用于Android和iOS开发。8.Pants构建系统(Twitter)2014年,Twitter推出了一个名为Pants的monorepo构建系统。今天,在v2中,Pants的目标是成为一个快速、可扩展的构建系统,以适应不断增长的代码库。目前,它的重点是Python,很快就会支持其他语言。Pants使用细粒度的工作流程并将每个工作单元与副作用隔离开来,因此可以利用所有可用的核心。Pant的一些最佳特性包括显式依赖建模、细粒度失效、共享结果缓存、并发执行、远程执行以及通过插件API实现的可扩展性和可定制性。Pants引擎是用Rust编写的以提高性能。为了熟悉和简单,构建规则是用类型化的Python3编写的。该引擎的设计使得细粒度失效、并发、密封、缓存和远程执行自然发生,无需规则作者的干预。9.PleasebuildsystemPlease是一个强调高性能、可移植性、可扩展性和正确性的跨语言构建系统。请确保构建步骤在它们自己的密封环境中执行,只访问它们被授予的文件和环境变量。增量构建意味着它只构建它需要的东西,它还提供任务并行性和分布式缓存,以实现可靠且高性能的大规模构建系统。请还旨在关注开发体验,以便您可以享受通用CLI并为使用自动完成的常见任务定义别名。用Go编写,Please提供了所有这些没有运行时依赖性的用户体验。而且,没有一个大型工作区文件需要处理太多配置。10.OaoOao不是列表中最成熟、最丰富、最易用的工具,但它仍然很有趣。它是一个基于Yarn的、自以为是的monorepo管理工具,p提供了monorepo功能,例如安装所有依赖、添加/删除/升级子包依赖、验证版本号、确定更新的子包、一次发布所有东西,更新变更日志等。Oao允许您在所有子包上连续或并行运行命令或package.json脚本,可选择遵循反向依赖树。并且支持yarnworkspaces,整体优化monorepo依赖树,简化bootstrap和依赖的添加/升级??/删除。支持非单包发布:受益于oao的预发布检查、标签、版本选择、变更日志更新等,也可在您的单包、非单包中使用。需要注意的是Oao采用的是同步版本方案,所以在根级package.json配置了一个主版本,子包也会同步这个版本。你可以在这里试试。11.BoltBoltpkg旨在成为“功能强大的JavaScript项目管理工具”。Bolt在Yarn之上实现了工作空间的概念。BoltCLI在很大程度上是YarnCLI的替代品,您可以在任何Yarn项目中使用它。我们知道工作区嵌套在一个更大的项目/repo中,每个工作区都可以有自己的依赖项、自己的代码和脚本。工作区也可以组织成子目录。使用Bolt,您可以一次安装所有这些包依赖项(而且您可以非常非常快地完成)。此外,当您指定从一个工作区到另一个工作区的依赖项时,它将链接到源代码。这样,当你去测试你的代码时,你所有的更改都会一起测试。来源:https://blog.bitsrc.io/11-tools-to-build-a-monorepo-in-2021-7ce904821cc2作者:JonathanSaring扫描下方二维码。转载本文请联系前端全栈开发公众号。