mcpField
P
pnpm

pnpm

github.com/mindrally开发289737 次安装3 周前更新
代码仓库

关于 pnpm

这项开发技能介绍如何用 pnpm 管理 JavaScript 和 TypeScript 依赖及工作区,涵盖包操作、单仓库工作流、锁文件和配置实践。

主要功能

  1. 01依赖安装与管理
  2. 02工作区和单仓库配置
  3. 03包筛选与任务执行
  4. 04依赖覆盖和 peer 设置
  5. 05发布工作区包
  6. 06锁文件与 CI 缓存实践

适用场景

  1. 01配置 pnpm 工作区
  2. 02在选定包中运行脚本
  3. 03管理内部工作区依赖
  4. 04为 CI 准备依赖安装

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mindrally/skills --skill pnpm

安装后在 Claude Code 中输入/pnpm确认已加载。

详细介绍

pnpm 开发

你是 pnpm 专家。pnpm 是一款适用于 JavaScript 和 TypeScript 项目的包管理器,速度快且节省磁盘空间。

核心原则

  • 始终使用 pnpm(而非 npm 或 yarn)管理包
  • 利用 pnpm 严格的依赖解析机制,提升安全性
  • 使用内容寻址存储,节省磁盘空间
  • 保持锁文件(pnpm-lock.yaml)一致

安装和设置

  • 全局安装 pnpm:npm install -g pnpm
  • 或使用 corepack:corepack enable && corepack prepare pnpm@latest --activate
  • 在 package.json 中指定 pnpm 版本:
    {
      "packageManager": "[email protected]"
    }
    

工作区配置

创建 pnpm-workspace.yaml 以设置 monorepo:

packages:
  - 'apps/*'
  - 'packages/*'
  - 'tooling/*'
  • 使用 glob 模式定义工作区包的位置
  • 所有匹配到的、包含 package.json 的目录都会成为工作区包

依赖管理

  • 安装依赖:pnpm install
  • 将依赖添加到指定工作区:
    pnpm add lodash --filter @org/my-app
    pnpm add -D typescript --filter @org/my-lib
    
  • 对内部依赖使用工作区协议:
    {
      "dependencies": {
        "@org/shared-utils": "workspace:*",
        "@org/ui": "workspace:^"
      }
    }
    
  • 协议选项:
    • workspace:* - 任意版本,发布时会替换为实际版本
    • workspace:^ - 兼容版本
    • workspace:~ - 仅限补丁版本

筛选命令

在指定包中运行命令:

pnpm --filter @org/my-app dev
pnpm --filter "./apps/*" build
pnpm --filter "...@org/my-lib" test  # Include dependents
pnpm --filter "@org/my-lib..." build  # Include dependencies
  • 筛选模式:
    • --filter <package-name> - 指定包
    • --filter "./path/*" - 按路径筛选
    • --filter "...<pkg>" - 包及其依赖它的包
    • --filter "<pkg>..." - 包及其依赖项

脚本和任务运行

  • 在多个工作区中运行脚本:
    pnpm -r run build        # Run in all packages
    pnpm -r --parallel run dev  # Run in parallel
    pnpm -r --stream run test   # Stream output
    
  • 为常见操作定义根级脚本:
    {
      "scripts": {
        "build": "pnpm -r run build",
        "dev": "pnpm --filter @org/web dev",
        "lint": "pnpm -r run lint",
        "test": "pnpm -r run test"
      }
    }
    

依赖提升

在 .npmrc 中配置提升:

# Strict mode - no hoisting
hoist=false

# Selective hoisting
public-hoist-pattern[]=*eslint*
public-hoist-pattern[]=*prettier*

# Shamefully hoist everything (not recommended)
shamefully-hoist=true
  • 优先使用严格模式,以实现更好的依赖隔离
  • 对需要扁平 node_modules 的工具使用公共提升

对等依赖

在 .npmrc 中配置对等依赖处理方式:

auto-install-peers=true
strict-peer-dependencies=false
  • 适当处理对等依赖警告
  • 清楚说明所需的对等依赖

覆盖和解析

在根目录的 package.json 中覆盖依赖:

{
  "pnpm": {
    "overrides": {
      "lodash": "^4.17.21",
      "[email protected]": "npm:bar@^2.0.0"
    }
  }
}
  • 使用覆盖修复安全漏洞
  • 固定有问题的传递依赖版本

发布工作区

  • 为可发布的包配置适当的字段
  • 使用 pnpm publish 发布
  • 工作区协议引用会替换为实际版本

性能优化

  • 在 Docker 中使用 pnpm fetch,以改善缓存效果:
    COPY pnpm-lock.yaml ./
    RUN pnpm fetch
    COPY . ./
    RUN pnpm install --offline
    
  • 为 CI 缓存配置存储位置
  • 在 CI 环境中使用 --frozen-lockfile

最佳实践

  • 始终提交 pnpm-lock.yaml
  • 使用 .npmrc 确保团队配置一致
  • 内部依赖优先使用 workspace:*
  • 保持根目录的 package.json 精简
  • 使用 pnpm dedupe 优化锁文件
  • 定期使用 pnpm audit 审计
  • 使用 pnpm why <package> 排查依赖问题
  • 集成 Turborepo 或 Nx,以实现高级任务运行
  • 设置 engine-strict=true,强制执行 Node.js 版本要求

评论

支持 Markdown