pnpm 管理 monorepo

6 篇文章 0 订阅
6 篇文章 0 订阅

使用 pnpm workspace 管理 monorepo 项目

安装 pnpm

pnpm 中文文档

什么是 monorepo

Monorepo 是项目管理代码的方式之一,指的是一个大项目中包含了需要小项目或者模块,大概的样子

├── packages
|   ├── pkg1
|   |   ├── package.json
|   ├── pkg2
|   |   ├── package.json
├── package.json

初始化项目

pnpm init

初始化一个项目,创建 package.json

.
└── package.json

在根目录中创建 pnpm-workspace.yaml

packages:
  - 'packages/**'

在根目录中创建 packages 文件夹,并且在 packages 中创建子项目

mkdir packages
mkdir packages/core
mkdir packages/browser

.
├── package.json
└── packages
    ├── browser
    └── core

安装全局依赖

-D 表示安装到开发依赖,即 devDependencies, -w 表示在根目录安装

pnpm install typescript -Dw

.
├── node_modules
│   └── typescript -> .pnpm/typescript@4.7.4/node_modules/typescript
├── package.json
├── packages
│   ├── browser
│   └── core
├── pnpm-lock.yaml
└── pnpm-workspace.yaml

局部依赖

首选在每个子项目中初始化 package.json

.
├── node_modules
│   └── typescript -> .pnpm/typescript@4.7.4/node_modules/typescript
├── package.json
├── packages
│   ├── browser
│   │   └── package.json
│   └── core
│       └── package.json
├── pnpm-lock.yaml
└── pnpm-workspace.yaml

packages/browser 中的 package.json

{
  "name": "@test/browser",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

packages/core 中的 package.json

{
  "name": "@test/core",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

这里需要给每个子项目指定命名空间和包名,即 @test/core

通过 filter 可以给指定的包安装依赖

pnpm install loadsh -r --filter @test/core
{
  "name": "@test/core",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "lodash": "^4.17.21"
  }
}

两个包之间相互依赖

browser 依赖 core

pnpm i @test/core -r --filter @test/browser

browser 中就依赖上了 core,版本前面有 workspace 字样,表示本地引用,发布的时候就会被剔除掉

{
  "name": "@test/browser",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@test/core": "workspace:^1.0.0"
  }
}

运行子包命令

根目录 package.json

使用 pnpm -r --filter=@test/* run test 来批量执行子包中的 test 脚本

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "pnpm -r --filter=@test/* run test"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "typescript": "^4.7.4"
  }
}

@test/browser 中的 package.json

{
  "name": "@test/browser",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"test browser\""
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@test/core": "workspace:^1.0.0"
  }
}

@test/core 中的 package.json

{
  "name": "@test/core",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"test core\""
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "lodash": "^4.17.21"
  }
}

执行 pnpm test,即可得到输出结果

> pnpm -r --filter=@test/* run test

Scope: 2 of 3 workspace projects
packages/core test$ echo "test core"test core
└─ Done in 13ms
packages/browser test$ echo "test browser"test browser
└─ Done in 8ms

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
首先,让我们解释一下这些术语的含义: - Monorepo:将多个相关项目放在同一个代码库中的做法。 - PNPM:一种 Node.js 包管理器,类似于 npm 和 yarn。 - React:一个流行的 JavaScript 库,用于构建用户界面。 现在,我们来看一下如何在 Monorepo 中使用 PNPM 和 React: 1. 创建一个 Monorepo 项目,将所有相关项目放在同一个代码库中。 2. 在根目录下创建一个 `package.json` 文件,并添加以下内容: ``` { "private": true, "workspaces": [ "packages/*" ] } ``` 这个配置告诉 PNPM,这是一个 Monorepo 项目,并且它应该将所有 `packages/*` 目录下的包视为一个工作空间。 3. 在 `packages/` 目录下创建一个新的 React 应用程序。你可以使用 `create-react-app` 工具来快速创建一个新项目: ``` npx create-react-app my-app ``` 4. 确保在 `packages/my-app` 目录下有一个 `package.json` 文件,并添加以下内容: ``` { "name": "my-app", "version": "0.1.0", "dependencies": { "react": "^17.0.2", "react-dom": "^17.0.2" }, "devDependencies": { "react-scripts": "^4.0.3" } } ``` 这个配置告诉 PNPM,这个包依赖于 React 和 React DOM 库,并且需要从 `react-scripts` 包中获取开发依赖项。 5. 在 `packages/my-app` 目录下运行以下命令,安装依赖项: ``` pnpm install ``` 6. 在 `packages/my-app` 目录下运行以下命令,启动 React 应用程序: ``` npm start ``` 这就是在 Monorepo 中使用 PNPM 和 React 的基本步骤。你可以使用相同的方法添加其他包和应用程序,并使用 PNPM 管理它们的依赖项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值