带有PNPM工作区的MonorePo
#javascript #node #monorepo #pnpm

monorepo?

monorepo是单个存储库,带有许多项目或软件包(库或模块),您可以将代码重复使用。

en.wikipedia.org/wiki/Monorepo对Monorepo有很好的解释,包括优势和缺点。

Monorepo structure

带有PNPM工作区的MonorePo

pnpm仅在packages.json上您的根存储库上的pnpm-workspace.yaml,带有 array路径packages属性中的目录。

packages:
    - "apps/*" # support glob pattern
    - "packages/*"
monorepo-example/
├─ apps/
├─ packages/
├─ package.json
└─ pnpm-workspace.yaml

注意apps/*packages/*是非常流行的monorepo结构,其中apps/*是项目目录,而packages/*是可重复使用的代码。

您只需要在packages列表中创建目录,将目录更改为pnpm init

mkdir -p packages/math-lib
cd packages/math-lib
pnpm init
cd ../..
mkdir -p apps/calculator
cd apps/calculator
pnpm init
cd ../..

列出所有工作区

列出JSON格式的所有工作区。

pnpm m ls --depth -1 --json

命令特定工作区

使用flag --filter在特定工作空间上运行命令以下在package.json中的name

# Format
pnpm --filter <workspace> <command>
pnpm -F <workspace> <command> # short alias
# Example
pnpm --filter math-lib add lodash
pnpm --filter math-lib add -D typescript @types/lodash
pnpm --filter calculator run test
# Support glob pattern
pnpm --filter pkg* run test

注意:pnpm使用package.json中的name属性过滤工作空间,因此请确保package.json中的name ever ever package.json是唯一的。

添加本地依赖性

使用flag --workspace添加局部依赖性到only adds the new dependency if it is found in the workspace

# Example
pnpm --filter calculator add math-lib --workspace

项目示例

mkdir -p monorepo-example
cd monorepo-example
pnpm init
mkdir -p packages/math-lib
cd packages/math-lib
pnpm init
cd ../..
mkdir -p apps/calculator
cd apps/calculator
pnpm init
cd ../..
touch packages/math-lib/index.js
touch apps/calculator/index.js
// packages/math-lib/index.js
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;

module.exports = {
  add,
  subtract,
};
// apps/calculator/index.js
const { add, subtract } = require("math-lib");

console.log(`9 + 10 = ${add(9, 10)}`);
console.log(`26 - 9 = ${subtract(26, 9)}`);
pnpm --filter calculator add math-lib --workspace
// apps/calculator/package.json
{
  "scripts": {
    "start": "node index.js"
  }
}
// package.json
{
  "scripts": {
    "calculator:start": "pnpm -F calculator run start"
  }
}
pnpm run calculator:start

output calculator run start