monorepo?
monorepo是单个存储库,带有许多项目或软件包(库或模块),您可以将代码重复使用。
en.wikipedia.org/wiki/Monorepo对Monorepo有很好的解释,包括优势和缺点。
带有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