ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多包管理工具lerna

2020-07-10 10:34:40  阅读:819  来源: 互联网

标签:npm 依赖 多包 管理工具 lerna scope packages 目录


背景

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

 

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

使用介绍 1、全局安装lerna npm install lerna -g 安装完成后,我们看一下控制台有没有这个命令:

 

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

 

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

 

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

 

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

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

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

 

 

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

 

 注意需要在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]

 

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

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

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

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

 

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

9、运行包的script命令 lerna run 命令 [--scope=特定的某个包] 和npm run [命令] 没什么区别,如果没有scope选项,lerna会运行每个包的script命令,如下:

 

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

标签:npm,依赖,多包,管理工具,lerna,scope,packages,目录
来源: https://www.cnblogs.com/qdlhj/p/13277983.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有