rushjs+pnpm之monorepo rush进阶

4,181 阅读3分钟

前言

在前一篇rushjs+pnpm之monorepo初探中我们通过rushjs+pnpm开始了我们的第一次monorepo的尝试,今天这一篇我们来讲一些进阶的使用,笔者主要会围绕自己在项目中使用的场景来做一些说明,不恰当之处还请各位同学雅正。

常用rush命令

rush add

rush add命令是比较常使用的一个命令,在上一篇中我们就使用到了rush add这个命令,我们通过rush add -p的命令在monorepo中新加了一个package,我们先来看看官方文档中对于这个命令的usage描述

usage: rush add [-h] -p PACKAGE [--exact] [--caret] [--dev] [-m] [-s] [--all]

添加package的我们已经使用过了,我们现在来试试为一个package添加一个库的情况,我们还是用上一篇文章中创建好的的monorepo项目来试试,为landing这个应用添加lodash这个库

cd apps/landing
rush add -p lodash

image.png

等安装命令执行结束之后我们来看看landing的package.json,可以看到已经添加到

image.png 看一下pnpm-lock.yaml的变化,可以看到有新增了这个lodash的变化 image.png 默认不加其他参数的话就是添加到dependencies里面,有时候我们需要添加的devDep的时候我们就加多一个--dev参数就可以了,我们试试加一个@types/lodash的库来看看,这种就是增加一些ts类型,只要添加到devDep就可以

image.png

image.png

rush build

构建命令,可以在项目部署或者CI流程中使用,我们可以看看官方文档中的usage

usage: rush build [-h] [-p COUNT] [-t PROJECT] [-T PROJECT] [-f PROJECT]
                  [-o PROJECT] [-i PROJECT] [-I PROJECT]
                  [--to-version-policy VERSION_POLICY_NAME]
                  [--from-version-policy VERSION_POLICY_NAME] [-v] [-c]
                  [--ignore-hooks] [--disable-build-cache]

没有加任何参数的情况下是全量构建所有项目,如果要构建指定的项目的话使用-t参数,上一篇中我们就已经使用过rush build全量构建过项目,这里我们来试一下指定单独的项目

image.png

这两个目录是build了之后生成的,我们先把这两个删除掉,后面看看有没有生成这个目录和产物 image.png

回到根目录运行构建命令

rush build -t @shared/components

image.png

image.png

我们试试构建landing这个package,把上面这个dist再删除掉,然后运行构建命令

rush build -t landing

image.png

这里说明一下,landing里面是引用了@shared/components这个包,所以landing构建的时候也是需要构建到@shared/components这个包的

image.png

rush list

这个命令就是展示所有的package,没有太多其他的作用

image.png

rush check

这个命令是比较有用的,就是检测每个子项目的package.json里面是否所有的依赖都是同个版本,比如我们上面用到的lodash 我们来实验一下,在@shared/components里面安装一个指定版本的lodash

rush add -p lodash@4.17.11

image.png

执行完成之后我们运行下命令来看看是否能检测到

rush check

image.png 我们可以可以看到,这里检测出lodash使用了不同的版本,这个可以配合这CI使用,在项目中我们一般会保证所有的库都是保持一样的版本,当某个库需要升级到最新版本的时候统一升级这个库的版本

rush purge

这个命令是用来删除rush创建的一些临时文件,当怀疑是一些缓存文件引发一些问题的时候,这个命令是非常有用的 这里我们就不展开实验了,这个命令可以配合这rush update一起用

rush update --purge

一些补充使用

pnpm-lock.yaml冲突

这种情况还是比较常见的,一般多个人开发的时候避免不了冲突的问题,只需要 重新rush update生成yaml文件提交上去即可