背景

最近有这么一个项目,这个项目需要依赖多个npm包,这些npm包有部分依赖是相同的(或者包与包之间有相互联系),如下:

多包管理工具lerna-冯金伟博客园

 如图1所示,这里有两个npm包:npm1和npm2,它们有公共的依赖base2。这种情况下我们该如何管理本地代码呢? 如果npm1和npm2本地代码分别存入一个单独的仓库,那么base2就需要copy一份,并且更新时两侧都要保持同步,另外如果还有更多的包,更多的公共依赖,那代码的维护就更加麻烦了! 为了解决这个问题,我们引入一个包管理工具——lerna。

使用介绍
1、全局安装lerna npm install lerna -g 安装完成后,我们看一下控制台有没有这个命令:
多包管理工具lerna-冯金伟博客园

 图2显示版本为3.16.4,说明我们已经安装成功了。 2、初始化我们的项目仓库,先创建一个lerna-repo目录,然后进入此目录运行下面的命令 lerna init //先采用默认模式,生成图3目录结构

多包管理工具lerna-冯金伟博客园

 很明显lerna.json是lerna的配置文件(你会发现很多工具都有本地的配置文件以便用户可以根据自己的业务自定义能力),打开这个json文件,如下图:

多包管理工具lerna-冯金伟博客园

 我们先关注这个packages属性,它是一个数组,每个元素代表可以发布的npm包的目录,比如图4中代表packages目录(初始化生成的)下所有的文件夹都是可以发版的npm包,另外也可以自定义npm包的目录,如下:

多包管理工具lerna-冯金伟博客园

 图5中我们自定义了一个目录——packages/plugins下所有的文件夹都是可以发版的npm包。 我们再看一眼图3,一般lerna-repo目录下可以存放各种依赖lib和入口entry,通过构建工具script tool将这些代码打包进packages目录中

3、生成一个npm包 lerna create <包名> [目录]

多包管理工具lerna-冯金伟博客园

图6中,我们在packages/plugins目录下生成一个名为npm1的包,生成后的目录结构如下:

多包管理工具lerna-冯金伟博客园

如果是放在默认packages里面的话,不需要输入目录

多包管理工具lerna-冯金伟博客园

 注意需要在git环境下进行添加否则会出现报错

 lerna ERR! ENOGIT The git binary was not found, or this is not a git repository.

4、为包添加依赖 lerna add 包名 [–scope=特定的某个包] [–dev] 功能类似于npm install 包名,scope指定为某个包添加依赖,如果没有scope选项,就会为packages下所有的包添加这个依赖;dev选项代表依赖添加进devDependencies中。 5、查看整个工程目录下有哪些包 lerna list [-l]

多包管理工具lerna-冯金伟博客园

 个人比较喜欢加一个-l先选项,信息会更加全面一些。

6、为每个包安装依赖 lerna bootstrap [–scope=特定的某个包] 功能和npm install差不多,如果不加scope,lerna会把工程下的所有包的依赖都安装好!

7、删除包下面的node_modules 上面的命令安装依赖会在每个包目录下生成node_modules,下面的命令就是将node_modules删除 lerna clean

8、导入外部的包(这个命令比较有意思) lerna import 外部包的位置 –dest=工程下的位置

多包管理工具lerna-冯金伟博客园

 图9中,koa是一个开源的包,我们用git下载到本地,然后用上面的命令导入到packages/plugins目录下,不仅代码会被导入,连git的操作历史也会被一起导入,所以它的应用场景也就非常的明确,就是为了将已经存在的npm包代码库迁移到 lerna 仓库中。

9、运行包的script命令 lerna run 命令 [–scope=特定的某个包] 和npm run [命令] 没什么区别,如果没有scope选项,lerna会运行每个包的script命令,如下:
多包管理工具lerna-冯金伟博客园

 参考来源于:https://www.bilibili.com/read/cv4948266/