Skip to content
微信公众号

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进行包管理。

  1. 安装
shell
pnpm add -Dw @changesets/cli
  1. 初始化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 优先的未更新问题

初始化完毕后的工程目录结构如下:

相关文章

本站总访问量次,本站总访客数人次
Released under the MIT License.