前置知识:pnpm
- pnpm的特点
- 快速: pnpm是同类工具速度的近两倍
- 高效:node_modules中的文件均克隆或硬连接到单一存储位置
- 支持单体仓库:pnpm 内置了对单个源码仓库中包含多个软件包的支持
- 权限严格:pnpm 创建的 node_modules 默认并非扁平结构,因此代码无法对任意软件包进行访问
-
过滤命令:将命令限制于包的特定子集。
pnpm --filter <package_selector> <command> -
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 包的安装。 搭建流程如下:
- 运行命令npm install pnpm -g, 全局安装pnpm
- 在项目中建立一个pnpm-workspace.yaml的文件
- 在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。
如何发布更改
- 运行
pnpm changeset version命令,将会根据之前pnpm changeset登记的版本和更改信息,去更改每个包中package.json的版本和CHANGELOG文件 - 运行
pnpm install命令更新lockfile和重新在项目中建立链接 - Commit更改
- 运行
pnpm publish -r命令,会发布所有升级的包
怎样一个命令同时执行多个包中的打包命令
- 使用npm命令安装工具concurrently,使用这个工具可以同时执行两个npm 命令
- pnpm 的--filter参数是可以指定可以执行的包。例如执行:pnpm start --filter 'pro-a'。表示执行执行pro-a下的start命令。
- 使用concurrently和 pnpm的参数结合就可以同时执行多个包的打包命令