如何快速搭建单仓库多包项目(monorepo)

652 阅读3分钟

前置知识:pnpm

  1. pnpm的特点
  • 快速: pnpm是同类工具速度的近两倍
  • 高效:node_modules中的文件均克隆或硬连接到单一存储位置
  • 支持单体仓库:pnpm 内置了对单个源码仓库中包含多个软件包的支持
  • 权限严格:pnpm 创建的 node_modules 默认并非扁平结构,因此代码无法对任意软件包进行访问
  1. 过滤命令:将命令限制于包的特定子集。

    pnpm --filter <package_selector> <command>
    
  2. workspace协议

    pnpm 支持 workspace 协议 workspace: 。 当使用此协议时,pnpm 将拒绝解析除本地 workspace 包含的 package 之外的任何内容。 因此,如果您设置为 "foo": "workspace:2.0.0" 时,安装将会失败,因为 "foo@2.0.0" 不存在于此 workspace 中。

    一个 workspace 的根目录下必须有 pnpm-workspace.yaml 文件,

如何快速搭建单仓库多包项目?

这里我们使用了pnpm workspace 。Pnpm workspace的好处是搭建快,使用方便,而且pnpm也能加速npm 包的安装。 搭建流程如下:

  1. 运行命令npm install pnpm -g, 全局安装pnpm
  2. 在项目中建立一个pnpm-workspace.yaml的文件
  3. 在pnpm-workspace.yaml中添加workspace的信息:
packages: 'packages/**'

这表示在packages文件夹下会放置多个npm包。可以配置多个文件夹,做进一步的分类。

子包之间如何互相引用?

使用单仓库多包一个重要的特性就是可以方便的子包之间互相引用。包之间互相引用的方法如下:

"dependencies": {
   "@life/behaviors": "workspace:*",
   "@life/xxx": "workspace:*",
   "@life/sss": "workspace:*"
 }

在需要引用子包的后面添加”workspace: *”,这样如果在工作空间中有这个包,就可以直接引用到。

如何方便管理每个包的版本

changeset是一个版本管理工具,可以自动更改版本和生产CHANGELOG。

如何登记变更和版本

更新代码后,需要增加版本和更新信息的时候,可以运行pnpm changeset,可以选择需要更新的包。选中后,选择要发的版本号,输入这一版更新了什么,就登记了一次changeset。登记以后可以commit代码,这样生成changelog的时候会增加hash。

如何发布更改
  1. 运行 pnpm changeset version命令,将会根据之前pnpm changeset登记的版本和更改信息,去更改每个包中package.json的版本和CHANGELOG文件
  2. 运行pnpm install命令更新lockfile和重新在项目中建立链接
  3. Commit更改
  4. 运行pnpm publish -r命令,会发布所有升级的包

怎样一个命令同时执行多个包中的打包命令

  1. 使用npm命令安装工具concurrently,使用这个工具可以同时执行两个npm 命令
  2. pnpm 的--filter参数是可以指定可以执行的包。例如执行:pnpm start --filter 'pro-a'。表示执行执行pro-a下的start命令。
  3. 使用concurrently和 pnpm的参数结合就可以同时执行多个包的打包命令