pnpm monorepo

240 阅读2分钟

案例

  1. 初始化项目
npm install -g pnpm
git init mono-repo
cd mono*
pnpm init
  1. 创建pnpm-workspace.yaml文件
packages: # 所有在 packages/ 子目录下的 package
- 'packages/**'
# 不包括在 test 文件夹下的 package
- '!**/test/**'
  1. 创建文件夹packages/packageapackages/packageb并初始化package.json配置
# 自动
npm init -w ./packages/packagea -y
npm init -w ./packages/packageb -y

# 手动
mkdir packages
mkdir packages/packagea && cd packages/packagea && pnpm init
cd ../../
mkdir packages/packageb && cd packages/packageb && pnpm init
cd ../../

image.png

注意 npm init生成的包名会直接转换成小写,pnpm init不会

  1. 依赖安装、删除

    全局安装依赖

    pnpm add moment -w
    pnpm remove moment -w
    

    子包安装依赖

    # 1. 子目录中操作
    cd packages/packagea
    pnpm add moment
    pnpm remove moment
    
    # 2. 根目录中操作
    pnpm add lodash --filter packageb
    pnpm remove lodash --filter packageb
    

    子项目间依赖

    pnpm add packagea --filter packageb # 在子项目B中依赖最新版本的子项目A
    pnpm remove packagea --filter packageb # 在子项目B中不依赖最新版本的子项目A
    
  2. 运行脚本 运行根目录package.json脚本

    # 根目录中操作
    pnpm test
    

    运行子项目package.json脚本

    # 子项目中操作
    pnpm test --filter packagea
    
    # 子项目中操作
    cd packages/packagea
    pnpm test
    

    运行每个packages中子包的package.json脚本

    pnpm  test -r
    
  3. 发布

pnpm推荐使用版本控制工具changesets/Rush

这部分的实战代码后续会补上

  • 安装

    pnpm install @changesets/cli -w --save-dev
    
  • 生成 changeset相关文件

    pnpm changeset init
    

    image.png

    • changelog: changelog 生成方式
    • commit: 不要让 changeset 在 publish 的时候帮我们做 git add
    • linked: 配置哪些包要共享版本
    • access: 公私有安全设定,内网建议 restricted ,开源使用 public
    • baseBranch: 项目主分支
    • updateInternalDependencies: 确保某包依赖的包发生 upgrade,该包也要发生 version upgrade 的衡量单位(量级)
    • ignore: 不需要变动 version 的包
  • 变更集

    pnpm changeset
    
    # 或
    pnpm changeset add
    

    该命令将询问一系列问题,首先是您要发布的包,然后是每个包的semver bump类型,然后是整个变更集的摘要。在最后一步,它将显示它将生成的变更集,并确认您要添加它。

  • 发布

    pnpm changeset publish