当前位置:网站首页>从0开始使用pnpm构建一个Monorepo方式管理的demo
从0开始使用pnpm构建一个Monorepo方式管理的demo
2022-07-03 09:01:00 【科技那些事儿】
写在前面
Monorepo这个词你应该不止一次听说了,像Vue3、Vite、ElementPlus等优秀开源项目都是使用Monorepo的方式管理项目,且这里说到的这几个项目都是采用pnpm作为包管理工具。
这篇文章就使用pnpm构建一个简单的Monorepo方式管理的项目。
什么是Monorepo?什么是pnpm?
Q:什么是Monorepo?
A:Monorepo是一种项目管理方式,就是把多个项目放在一个仓库里面,可以参考神三元大佬的一篇文章:现代前端工程为什么越来越离不开 Monorepo?,这篇文章中介绍了Monorepo的概念、收益以及MulitRepo的弊端。
Q:什么是pnpm?
A:pnpm就是一个包管理工具,原生支持Monorepo,比npm和yarn更快一些,其他的可以参考官网和神三元大佬的另一篇文章:为什么现在我更推荐 pnpm 而不是 npm/yarn?
搞一个Monorepo的demo玩玩
现在我们就开始使用pnpm来构建一个Monorepo,在正事开始之前,你先需要保证你的电脑中具有Node.js,我的版本的是16.9.0。
首先你需要有pnpm这个工具,安装的话可以从官网找方法,或者直接使用npm安装,命令如下:
npm i pnpm -g
现在我们开始搞事情。
第一步,创建一个项目的根目录,这里就叫monorepo-demo,咋创建都可,这里使用的是命令:
mkdir monorepo-demo
第二步,初始化package.json,这个没啥说的,命令如下:
pnpm init
这里我对内容做了一点修改,package.json的内容如下:
{
"name": "monorepo-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"type": "module",
"keywords": [],
"author": "ywanzhou",
"license": "MIT"
}
这里我主要添加了一个type字段,这里我使用ESModule模块化规范。
第三步,创建pnpm-workspace.yaml文件,这个文件定义了工作空间的根目录,内容如下:
packages:
- 'packages/ **'
现在我们就可以在packages中创建多个项目了,目录结构如下:
monorepo-demo
├── package.json
├── packages
│ ├── components
│ │ ├── index.js
│ │ └── package.json
│ ├── core
│ │ ├── index.js
│ │ └── package.json
│ ├── utils
│ │ ├── index.js
│ │ └── package.json
├── pnpm-lock.yaml
└── pnpm-workspace.yaml
第四步,编写每个项目的package.json,其实主要是编写一下名称,方便以后使用,这里我的如下:
{
"name": "@packages/components",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"type": "module",
"license": "ISC",
"dependencies": {
"lodash": "^4.17.21",
"@packages/utils": "workspace:^1.0.0"
}
}
剩余的两个名称分别为@packages/core和@packages/utils。
其实到这基本工作就准备好了,现在介绍一下如何安装依赖,如何在packageA中引用packageB。
安装依赖
就这个demo来说,我们如果在根目录下安装依赖的话,这个依赖可以在所有的packages中使用,如果我们需要为具体的一个package安装依赖怎么办?
cd到package的所在目录嘛?漏,大漏特漏,我们可以通过下面这个命令:
pnpm --filter <package_selector> <command>
例如我们需要在@packages/components安装lodash,命令如下:
pnpm -F @packages/components add lodash
-F等价于--filter
现在我们在往@packages/utils中安装一个dayjs,命令如下:
pnpm --filter @packages/utils add dayjs
packageA中引用packageB
现在我们就来实现package间的相互引用,首先我们在@packages/utils/index.js中写入如下内容:
import dayjs from 'dayjs'
export function format(time, f = 'YYYY-MM-DD') {
return dayjs(time).format(f)
}
然后我们执行如下命令:
pnpm -F @packages/components add @packages/[email protected]*
这个命令表示在@packages/components安装@packages/utils,其中的@*表示默认同步最新版本,省去每次都要同步最新版本的问题。
安装完成后@packages/components/package.json内容如下:
{
"name": "@packages/components",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"type": "module",
"license": "ISC",
"dependencies": {
"@packages/utils": "workspace: *",
"lodash": "^4.17.21"
}
}
然后我们在@packages/components/index.js写入如下内容:
import { format } from '@packages/utils'
console.log(format(new Date()))
然后我们在项目根目录运行如下命令
node packages/components
即可打印出当前的日期。
边栏推荐
- State compression DP acwing 91 Shortest Hamilton path
- STM32F103 can learning record
- Navicat, MySQL export Er graph, er graph
- ERROR: certificate common name “www.mysql.com” doesn’t match requested host name “137.254.60.11”.
- Spark 结构化流写入Hudi 实践
- Database execution error: SQL_ mode only_ full_ group_ by:
- Apply for domain name binding IP to open port 80 record
- LeetCode每日一题(2115. Find All Possible Recipes from Given Supplies)
- [point cloud processing paper crazy reading classic version 12] - foldingnet: point cloud auto encoder via deep grid deformation
- Digital management medium + low code, jnpf opens a new engine for enterprise digital transformation
猜你喜欢

图像修复方法研究综述----论文笔记

Crawler career from scratch (II): crawl the photos of my little sister ② (the website has been disabled)
![[point cloud processing paper crazy reading classic version 13] - adaptive graph revolutionary neural networks](/img/61/aa8d0067868ce9e28cadf5369cd65e.png)
[point cloud processing paper crazy reading classic version 13] - adaptive graph revolutionary neural networks

【点云处理之论文狂读经典版8】—— O-CNN: Octree-based Convolutional Neural Networks for 3D Shape Analysis

【点云处理之论文狂读经典版10】—— PointCNN: Convolution On X-Transformed Points

Utilisation de hudi dans idea
![[point cloud processing paper crazy reading frontier version 10] - mvtn: multi view transformation network for 3D shape recognition](/img/94/2ab1feb252dc84c2b4fcad50a0803f.png)
[point cloud processing paper crazy reading frontier version 10] - mvtn: multi view transformation network for 3D shape recognition
![[kotlin puzzle] what happens if you overload an arithmetic operator in the kotlin class and declare the operator as an extension function?](/img/fc/5c71e6457b836be04583365edbe08d.png)
[kotlin puzzle] what happens if you overload an arithmetic operator in the kotlin class and declare the operator as an extension function?
![[point cloud processing paper crazy reading classic version 9] - pointwise revolutionary neural networks](/img/ea/2c4336ee929c26c16627e5c0955704.png)
[point cloud processing paper crazy reading classic version 9] - pointwise revolutionary neural networks

IDEA 中使用 Hudi
随机推荐
Banner - Summary of closed group meeting
【Kotlin学习】类、对象和接口——定义类继承结构
Jenkins learning (II) -- setting up Chinese
Hudi integrated spark data analysis example (including code flow and test results)
Pic16f648a-e/ss PIC16 8-bit microcontroller, 7KB (4kx14)
Trial of the combination of RDS and crawler
Notes on numerical analysis (II): numerical solution of linear equations
LeetCode每日一题(2212. Maximum Points in an Archery Competition)
Explanation of the answers to the three questions
[point cloud processing paper crazy reading classic version 13] - adaptive graph revolutionary neural networks
【Kotlin学习】类、对象和接口——带非默认构造方法或属性的类、数据类和类委托、object关键字
The idea of compiling VBA Encyclopedia
Construction of simple database learning environment
[point cloud processing paper crazy reading classic version 11] - mining point cloud local structures by kernel correlation and graph pooling
[advanced feature learning on point clouds using multi resolution features and learning]
Hudi 数据管理和存储概述
NPM install installation dependency package error reporting solution
[point cloud processing paper crazy reading frontier version 11] - unsupervised point cloud pre training via occlusion completion
2022-1-6 Niuke net brush sword finger offer
【点云处理之论文狂读前沿版12】—— Adaptive Graph Convolution for Point Cloud Analysis