Lerna脚手架搭建(四):Lerna 核心操作
本文最后更新于:2024年12月10日 下午
上一节中,我们通过 lerna 创建了两个 package,core 和 utils,本节我们将例举 lerna 的几个核心命令的使用。
当我们遇到了不认识的 lerna 命令时,我们通常会通过两种方法去认识它:
- 这些命令都可以在 lerna 的 官网 找到;
- 通过执行 lerna -h 或 lerna add -h 命令查看帮助。
一、lerna add 👈
Add a dependency to matched packages
为匹配的软件包添加一个依赖关系
1$ lerna add <package>[@version] [--dev] [--exact] [--peer]
🟠 首先,在项目根目录下执行 lerna add markdown,执行完成后我们在 core 和 utils 里的 package.json 下都能看到多出了 markdown 的依赖;
⚠ 注意
如果直接执行 lerna add xxx 而不指定某个包,lerna 将会在当前项目下的所有包都安装依赖。
从命令执行输出中我们看到 lerna 已经帮我们做好了软连接。
通常,我们不需要在每一个包都安装依赖,只需要在某个包中安装,那咋办呢,我们继续下一步。
🟠 执行 lerna clean 清除所有包下的 node_modules;
从命令执行中我们看到 lerna 已经帮我们把每个包中的 node_modules 目录列出来了。
🟠 执行 lerna add markdown packages/core/
从打印信息中,我们可以看到一个警告信息:lerna WARN No packages found where markdown can be added.;
出现该警告是因为上一步中,我们把包下的 node_modules 删除了,但在 package.json 中该依赖还存在,因此,我们把 core 和 utils 包里的依赖手动删除就可以了。
🟠 再次执行 lerna add markdown packages/core/
可以看到添加成功,在 packages/core/ 下的 package.json 里即可找到该依赖项。
🟠 再次执行 lerna clean 清除 node_modules。
二、lerna bootstarp 👈
Link local packages together and install remaining package dependencies
将本地软件包连接在一起,并重新安装已有的软件包依赖
1$ lerna bootstrap
🟠 执行 lerna bootstarp
可以看到,刚才 lerna clean 清除的 node_modules 又回来了。
🟠 再次执行 lerna clean 清除 node_modules。
三、lerna link 👈
Symlink together all packages that are dependencies of each other
将所有相互依赖的软件包链接在一起
1
$ lerna link
🟠 当前直接执行 lerna link,发现没有效果
因为我们当前并不存在互相依赖的软件包。
🟠 修改 utils/package.json 内的 main 参数为:‘lib/index.js’,并重命名 utils/lib/utils.js 文件名称为 index.js;
🟠 在 core/package.json 内加入依赖 utils:“@xuven-cli-dev/utils”: “^1.0.0”,保存;
🟠 再次执行 lerna link 可以看到 core/node_modules 下生成了指向本地 的软链接。
四、lerna exec 👈
Execute an arbitrary command in each package
在每个包中执行一个任意的命令
1
2
3
$ lerna exec -- <command> [..args] # runs the command in all packages
$ lerna exec -- rm -rf ./node_modules
$ lerna exec -- protractor conf.js
🟠 执行 lerna exec -- rm -rf node_modules/,即可在全部包内删除 node_modules 文件夹;
🟠 执行 lerna bootstrap 重装依赖;
🟠 在 utils 下手动创建 node_modules 文件夹;
🟠 执行 lerna exec --scope core -- rm -rf node_modules/,报错,找不到 package
这里是因为这里不能使用包的文件夹名,需要使用包名称;
🟠 执行 lerna exec --scope
可以看到,core 下的 node_modules 已经删除。
五、lerna run 👈
Run an npm script in each package that contains that script
在每个包含该脚本的软件包中运行一个npm脚本
1
2
3
4
5
6
$ lerna run <script> -- [..args] # runs npm run my-script in all packages that have it
$ lerna run test
$ lerna run build
# watch all packages and transpile on change, streaming prefixed output
$ lerna run --parallel watch
🟠 执行 lerna run test,发现报错
这里能直接执行 lerna run test 是由于 core 和 utils 内的 package.json 都存在 scripts 配置的 test 参数;
这里报错是因为 test 参数命令后面的 exit 1
🟠 把 core/pacakge.json 里 scripts 参数的 test 改为:"echo \"Run testing from core\""
🟠 同样,把 utils/pacakge.json 里 scripts 参数的 test 改为:"echo \"Run testing from utils\""
🟠 再次执行 lerna run test 可以看到执行成功的输出。
🟠 同样,执行 lerna run --scope 即可运行 core 下的 test。