pnpm workspace is pnpm's built-in monorepo solution for managing multiple packages in one repository.
Basic Configuration:
yaml# pnpm-workspace.yaml packages: - 'packages/*' # All packages under packages directory - 'apps/*' # All apps under apps directory - 'shared/*' # Shared modules
Project Structure Example:
shellmy-monorepo/ ├── pnpm-workspace.yaml ├── package.json ├── pnpm-lock.yaml ├── packages/ │ ├── ui/ │ │ ├── package.json │ │ └── src/ │ └── utils/ │ ├── package.json │ └── src/ └── apps/ ├── web/ │ ├── package.json │ └── src/ └── server/ ├── package.json └── src/
Inter-package Dependencies:
json// apps/web/package.json { "name": "@my-org/web", "dependencies": { "@my-org/ui": "workspace:*", // Use workspace protocol "@my-org/utils": "workspace:^1.0.0" } }
Workspace Protocol Types:
json{ "dependencies": { "package": "workspace:*", // Use latest version "package": "workspace:^", // Compatible version "package": "workspace:~", // Approximate version "package": "workspace:^1.0.0" // Specified version range } }
Common Commands:
bash# Install all dependencies pnpm install # Run command in specific package pnpm --filter @my-org/ui build pnpm -F @my-org/ui build # Shorthand # Run command in all packages pnpm -r build # Recursive execution # Run only in changed packages pnpm -r --filter "...[origin/main]" build # Add inter-package dependency pnpm --filter @my-org/web add @my-org/ui
Advantages Comparison:
| Feature | pnpm workspace | Lerna | Yarn Workspaces |
|---|---|---|---|
| Built-in Support | ✅ | ❌ Need install | ✅ |
| Dependency Sharing | ✅ Hard links | ❌ | ✅ Symlinks |
| Disk Efficiency | Highest | Average | Medium |
| Configuration Complexity | Simple | Complex | Simple |
Best Practices:
bash# Use changesets for version management pnpm add -Dw @changesets/cli pnpm changeset init # Release workflow pnpm changeset # Record changes pnpm changeset version # Update versions pnpm -r publish # Publish all packages