pnpm
TIP
地址为:https://pnpm.io/
pnpm 是新一代的包管理工具,号称是最先进的包管理器。按照官网说法,可以实现节约磁盘空间并提升安装速度和创建非扁平化的 node_modules 文件夹两大目标,具体原理可以参考 pnpm 官网。
pnpm 提出了 workspace 的概念,内置了对 monorepo 的支持,那么为什么要用 pnpm 取代之前的 lerna 呢?
- lerna 已经不再维护,后续有任何问题社区无法及时响应
- pnpm装包效率更高,并且可以节约更多磁盘空间
- pnpm本身就预置了对monorepo的支持,不需要再额外第三方包的支持
monorepo工程的搭建
首先需要安装pnpm
shell
npm install -g pnpm
然后创建工程基本结构,先通过npm init初始化,然后在工程根目录下创建packages目录,在packages目录中创建子包core和web-sdk,在core和web-sdk再分别去使用npm init初始化工程,使用tsc --init去创建ts.config.js。
为了防止根目录被发布出去,需要设置工程工程个目录下 package.json配置文件的 private 字段为 true。
使用pnpm的workspace功能,需要在工程根目录下添加pnpm-workspace.yaml文件,并且在pnpm-workspace.yaml中指定空间的目录。
js
packages:
- 'packages/*'
workspace 中的包版本管理是一个复杂的任务,pnpm 目前也并未提供内置的解决方案。 不过,有两个不错且支持 pnpm 的版本控制工具可以使用:
这里使用changesets进行包管理。
- 安装
shell
pnpm add -Dw @changesets/cli
- 初始化changesets
shell
pnpm changeset init
执行完初始化命令后,会在工程的根目录下生成 .changeset 目录,其中的 config.json 作为默认的 changeset 的配置文件。配置文件内容如下:
js
{
"$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [],
"access": "restricted",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": []
}
- changelog: changelog 生成方式
- commit: 不要让 changeset 在 publish 的时候帮我们做 git add
- linked: 配置哪些包要共享版本
- access: 公私有安全设定,内网建议 restricted ,开源使用 public
- baseBranch: 项目主分支
- updateInternalDependencies: 确保某包依赖的包发生 upgrade,该包也要发生 version upgrade 的衡量单位(量级)
- ignore: 不需要变动 version 的包
- ___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH: 在每次 version 变动时一定无理由 patch 抬升依赖他的那些包的版本,防止陷入 major 优先的未更新问题
初始化完毕后的工程目录结构如下: