APP下载

Web | 工程化:工具篇(一)

原创

Web

幸福三要素:有要做的事(something to do)、有要爱的人(someone to love)、有寄予希望的东西(something to hope for) —— 亚历山大·查默斯

Monorepo

在采用 Monorepo(单一仓库)架构的软件开发中,工具的选择是至关重要的。合适的 Monorepo 工具能够帮助团队更高效地管理大规模代码库、提升协同开发体验以及优化构建和部署流程。

  1. 2024年比较流行的monorepo 工具:
  • Rush

由 Microsoft 打造的 Monorepo 管理工具,旨在优化大型项目的构建和开发流程。它支持同时管理多个包,提供自动版本管理、并行构建、增量构建等功能,通过统一的命令行工具简化 Monorepo 的操作。尽管具有完整的生态系统和强大的社区支持,但学习曲线可能较陡峭,适用于大型项目而对小型项目可能显得过于庞大。

  • Turborepo

专注于提升大型 Monorepo 项目性能的工具,通过支持并行构建和增量构建等功能,显著减少了构建时间,同时具备分布式缓存和模块化工具链设计,为开发者提供了更灵活的定制选择。

  • Lerna

一款专为管理具有多个软件包的 JavaScript 项目而设计的工具,旨在优化大型 Monorepo 项目的版本管理、依赖共享以及发布流程。通过提供一套强大的命令行工具,Lerna 简化了 Monorepo 项目的操作,使开发者能够更轻松地管理和维护庞大的代码库,提高开发效率和代码的可维护性。

  • Yarn Workspaces

Yarn 包管理器的一项强大功能,专注于优化 Monorepo 项目的依赖关系管理。它允许将多个包组织在同一个版本控制存储库中,通过统一依赖版本解决了版本冲突问题,同时通过共享顶层 node_modules 目录,有效减小了磁盘占用。Yarn Workspaces 支持交叉包引用,提供了更灵活的项目组织方式,并通过并行安装加速了整体构建速度。它是一个轻量级而功能强大的 Monorepo 解决方案,尤其适用于中小型项目和对简单性要求较高的团队。

  • pnpm workspaces

pnpm 包管理工具的一个功能模块,专注于支持 Monorepo(单一仓库)的工作区管理。它通过高效的依赖共享机制,将多个相关的包集中管理,实现了更快速、更节省空间的依赖安装和执行。

  • yalc

「Yalc」 是一款专注于本地软件包管理的工具,为 Monorepo 项目提供了轻便而强大的解决方案。其主要功能包括将本地修改的软件包快速发布到本地 registry,并在其他项目中进行引用,以及支持在 Monorepo 中进行快速本地迭代,提高开发效率。Yalc 的简便性和专注于本地开发的特点,使其成为解决 Monorepo 项目中本地软件包管理问题的有力工具。

  • npm workspaces

npm 包管理工具的功能模块之一,旨在支持 Monorepo(单一仓库)结构的项目。该功能允许在单一仓库中管理多个包,通过一个统一的 package.json 文件来管理各个包的依赖和脚本。

提供了一种相对轻量级的方案,适用于一些小型或者简单的 Monorepo 项目,无需引入额外的复杂性。

  • Nx

一个开源的工具,专为管理和开发大型 Monorepo 项目而设计。它建立在 Angular CLI 之上,提供了一套功能强大的工具和插件,支持多语言、多框架的项目。Nx 的核心理念是通过插件化的方式,为开发者提供更高层次的抽象,以提高项目的可维护性、可扩展性和开发效率。Nx 支持生成可重用的领域库、定义和执行一致的工作流,以及提供强大的可视化工具来监控项目和性能。

pnpm 版本控制

Lerna + Conventional Changelog

尽管 Lerna 不再负责依赖管理,但它将更多关注点放在了 Monorepo 项目的版本管理和发布上。通过结合 Lerna 和 Conventional Changelog 两个工具,我们可以轻松地统一修改 Monorepo 项目中各个子模块的关联版本号,并记录每次修改的日志。虽然其操作模式相对固定,不太适用于添加自定义流程,但在特定场景下,其操作简单,特别适合新手团队使用。以下是项目中添加的构建脚本的简化示例:

               
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
{ "release": "npm-run-all version:lerna changelog version:git", "version:lerna": "lerna version $npm_package_version --exact --no-git-tag-version --force-publish --no-private", "version:git": "git add . && git commit -m "chore(release): publish $npm_package_version"", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0" } COPY

开发者在准备发布时,只需要执行 pnpm run release 这个集成命令,内部会分别按序执行 lerna version 、conventional-changelog 和 git xxx 三步命令。

Changesets

Changesets 是一个用于管理项目版本和发布流程的工具,它旨在使 Monorepo 项目中的版本管理更加清晰、灵活和易于协作。

相比于 Lerna + Conventional Changelog 工具,其指令更加简单,操作更加灵活,能够满足更多的定制化需求场景。我们项目中的构建脚本大致简化如下:

               
  • 1
  • 2
  • 3
  • 4
  • 5
{ "add": "pnpm changeset add", "version": "pnpm changeset version", "publish": "changeset publish" } COPY

需要注意的是 Changesets 工具的操作流程,会与传统的日志提交和发布流程有所不同,它引入了开发者和管理者的概念。开发者负责日常项目开发,保持代码的颗粒化修改提交并添加标记,而管理者主要负责对开发者的提交进行归类,并做统一的发布操作,操作流程图大致如下:

  • 首先,开发者完成每次的代码提交之后,只需要执行 changeset add 命令,以记录每次提交的版本变更信息;
  • 管理者需要定期对项目提交内容进行合并。执行 changeset version 命令后,我们可以查看在这段时间内所有的提交信息,并对其中不合适的地方进行适度修改。一旦完成这一步操作,即表示已经处理了近期的所有开发提交文件
  • 管理者只需要执行 changeset publish 命令,就可以为所有模块分别打上 tag 日志,并自动发布到镜像源

AI

LangChain

要点

  1. 乐高架构(可插拔架构),通过对「系统基本组件」的合理抽象,找到构造复杂系统的统一规律和可达路径,从而实现在降低系统实现复杂度的同时,提升系统整体的扩展性。

参考资料

  1. Monorepo 工具选择和实践:https://mp.weixin.qq.com/s/GLR1gnkZKj2HuiS7cDpabQ 
  2. LangChain工程化设计: https://mp.weixin.qq.com/s/zGS9N92R6dsc9Jk57pmYSg 

评论区

写评论

登录

所以,就随便说点什么吧...

这里什么都没有,快来评论吧...