一、什么是 lerna?
多包管理工具,方便我们在一个项目中管理多个 npm 包。它能够在发包时统一每个包的版本号,解决多包项目中每次发包都要手动修改各个包的版本号并单独发布的烦恼。
二、环境搭建
打开终端安装 lerna 环境
npm i lerna -g
三、使用
初始化项目
找一个空文件夹执行 lerna init
初始化项目。
初始化后的目录结构如下所示
├── lerna.json // lerna 的相关配置
├── package.json
└── packages // 约定了该文件夹下存放多个 npm 包。
创建项目包
通过命令行创建项目
lerna create moduleA
lerna create moduleB
本地包相互引用
lerna link
j假设moduleA依赖moduleB,现在我们在 moduleA 包下增加个依赖。
packages/moduleA/package.json
{
...
"dependencies": {
"moduleB": "^1.0.0"
},
...
}
在终端执行
lerna link
会在包中帮你安装moduleB依赖。
添加公共依赖
假设 moduleA 和 moduleB 都依赖 lodash
lerna add lodash
添加单独依赖
l 假设moduleA 自己依赖 jquery,moduleB 自己依赖 zepto
lerna add jquery --scope=@fengyinchao/modulea
lerna add zepto --scope=@fengyinchao/moduleb
卸载包
l 给 moduleA 移除一个依赖 husky
lerna exec --scope=@fengyinchao/modulea npm uninstall husky
重新安装依赖
lerna bootstrap
这样会帮我们安装package.json里的dependencies依赖项
抽离公共模块
上面 moduleA 和 moduleB 都依赖了 lodash,且在各自 package 下的node_modules 里都有副本,这其实很浪费空间,可以使用 --hoist
lerna bootstrap --hoist
这会将 packages 里重复的依赖提取到最外层的 node_modules 里,同时最外层的 package.json 也不会更新 dependency 信息,所以不建议将公用依赖写到最外层的package.json里,而是重复写到每个子package.json 里,然后用 --hoist 提取出来
更新公共依赖
假设要升级 moduleA 和 moduleB 都依赖的 lodash 版本,不必依次到各子package下升级,可以借助 lerna-update-wizard 这个包来做
// 根目录执行
npm install --save-dev lerna-update-wizard
四、发布
登录 npm
npm login
lerna changed
查看代码变化
lerna version
修改版本
lerna publish
发布
五、使用
安装:
npm i @syyyds-cli/vue2wx --save
使用脚手架:
"scripts": {
"dev": "lsy-cli-repo-lerna",
},
遇到的坑:
1、https://blog.csdn.net/hahahhahahahha123456/article/details/82054908
当执行npm publish,发生了如下错误:
lerna ERR! E401 [UNAUTHORIZED] Login first
起先以为是账户的问题,我就执行了npm adduser
和 npm login
都不行。
您首先执行下 npm adduser
,输入您相应的 Username 、 Password 、 Email: (this IS public) ,关键的一步来了!
Logged in as 您的Username on [https:*//registry.npmjs.org/.*](https://registry.npmjs.org/)
如果 on 后面不是 https://registry.npmjs.org/ ,而是其他的镜像,比如我们大家常见的淘宝镜像:
http://registry.npm.taobao.org/
那么您首先替换成原来的,替换成原来执行如下命令:
npm config set registry [https://registry.npmjs.org/](https://registry.npmjs.org/)
最后,替换完毕再执行npm adduser
、npm publish
,这样应该就ok了!
网友评论