问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用lerna管理monorepo及发npm包实战教程

发布网友 发布时间:2024-10-03 09:12

我来回答

1个回答

热心网友 时间:2024-10-18 05:25

在维护多个package项目的同学来说,都会面临一个选择:这些package是放在一个仓库里维护还是放在多个仓库里单独维护。数量较少的时候,多个仓库维护不会有太大问题,但是当package数量逐渐增多时,一些问题逐渐暴露出来。

因此,我们需要找寻一条新的道路来管理我们的项目,一个理想的开发环境可以抽象成这样:“只关心业务代码,可以直接跨业务复用而不关心复用方式,调试时所有代码都在源码中。”

在前端开发环境中,多 Git Repo,多 npm 则是这个理想的阻力,它们导致复用要关心版本号,调试需要npm link。而这些是Lerna + MonoRepo 最大的优势。

什么是lerna

用于管理具有多个包的JavaScript项目的工具。这个介绍可以说很清晰了,引入lerna后,上面提到的问题不仅迎刃而解,更为开发人员提供了一种管理多packages javascript项目的方式。

什么是monorepo

Monorepo 的全称是 monolithic repository,即单体式仓库,与之对应的是 Multirepo(multiple repository),这里的“单”和“多”是指每个仓库中所管理的模块数量。

Multirepo 是比较传统的做法,即每一个 package 都单独用一个仓库来进行管理。例如:Rollup, ...

Monorep 是把所有相关的 package 都放在一个仓库里进行管理,每个 package 独立发布。例如:React, Angular, Babel, Jest, Umijs, Vue ...

了解了基本概念后,详细介绍下使用方法与api。

常用命令

我们需要全局安装lerna工具。

为所有项目安装依赖,类似于npm/yarn i

提交对项目的更新 运行该命令会执行如下的步骤:

使用lerna 初始化项目

类似npm init命令

为packages文件夹下的package安装依赖

卸载依赖

比对包是否发生过变更

显示packages下的各个package的version

清理node_moles

lerna run 运行npm script,可以指定具体的package。

lerna.json解析

version:当前库的版本

useWorkspaces: 是否使用workspace来管理依赖 npmClient: 允许指定命令使用的client, 默认是 npm, 可以设置成 yarn command.publish.ignoreChanges:可以指定那些目录或者文件的变更不会被publish command.bootstrap.ignore:指定不受 bootstrap 命令影响的包 command.bootstrap.npmClientArgs:指定默认传给 lerna bootstrap 命令的参数 command.bootstrap.scope:指定那些包会受 lerna bootstrap 命令影响 packages:指定包所在的目录

使用lerna的基本工作流

环境配置

初始化一个lerna工程

在本地目录下初始化一个lerna工程。 1、创建一个空的文件夹,命名为my-app:

2、初始化 通过cmd进入相关目录,进行初始化

3、添加一个测试package 默认情况下,package是放在packages目录下的。但是自己想做一个组件库,改为了components

4、安装各packages依赖 这一步操作,官网上是这样描述的 在当前的Lerna仓库中引导包。安装所有依赖项并链接任何交叉依赖项。

5、发布 在发布的时候,就需要git工具的配合了。 所以在发布之前,请确认此时该lerna工程是否已经连接到git的远程仓库。你可以执行下面的命令进行查看。 本篇文章的代码托管在Github上。因此会显示此远程链接信息。 如果你还没有与远程仓库链接,请首先在github创建一个空的仓库,然后根据相关提示信息,进行链接。

第一次publish前我们需要执行

在输入用户名及密码之后执行这条命令

你就可以根据cmd中的提示,一步步的发布packges了。 实际上在执行该条命令的时候,lerna会做很多的工作。

到这里为止,就是一个最简单的lerna的工作流了。但是lerna还有更多的功能等待你去发掘。生成的packages如下:

工作模式

lerna有两种工作模式,Independent mode和Fixed/Locked mode,在这里介绍可能会对初学者造成困扰,但因为实在太重要了,还是有必要提一下的。 lerna的默认模式是Fixed/Locked mode,在这种模式下,实际上lerna是把工程当作一个整体来对待。每次发布packges,都是全量发布,无论是否修改。但是在Independent mode下,lerna会配合Git,检查文件变动,只发布有改动的packge。

使用lerna提升开发流程体验

接下来,我们从一个demo出发,了解基于lerna的开发流程。

项目初始化

我们需要维护一个UI组件库,其包含2个组件,分别为House(房子)和Window(窗户)组件,其中House组件依赖于Window组件。

增加依赖

接下来,我们来为组件增加些依赖,首先House组件不能只由Window构成,还需要添加一些外部依赖(在这里我们假定为lodash)。我们执行:

这句话会将lodash增添到House的dependencies属性里 我们还需要将Window添加到House的依赖里,执行:

自动检测到window隶属于当前项目,直接采用symlink的方式关联过去。 symlink:符号链接,也就是平常所说的建立超链接,此时House的node_moles里的Window直接链接至项目里的Window组件,而不会再重新拉取一份,这个对本地开发是非常有用的。

发布到npm

接下来,我们只需要简单地执行lerna publish,确认升级的版本号,就可以批量将所有的package发布到远程。 默认情况下会推送到系统目前npm对应的registry里,实际项目里可以根据配置package.json切换所使用的npm客户端。

更新模块

接下来,我们变更了Window组件,执行一下lerna updated,便可以得知有哪些组件发生了变更。

我们可以看到,虽然我们只变更了window组件,但是lerna能够帮助我们检查到所有依赖于它的组件,对于没有关联的组件,是不会出现在更新列表里的,这个对于相比之前人工维护版本依赖的更新,是非常稳健的。

集中版本号或独立版本号

截止目前,我们已经成功发布了2个package,现在再新增一个Tree组件,它和其他2个package保持独立,随后我们执行lerna publish,它会提示Tree组件的版本号将会从0.0.0升级至1.0.0,但是事实上Tree组件仅仅是刚创建的,这点不利于版本号的语义化,lerna已经考虑到了这一点,它包含2种版本号管理机制。

如果需要各个组件维护自身的版本号,那么就使用independent模式,只需要去配置leran.json即可。

TIPS:

yarn workspaces 命令 在根目录安装 npm 包,以 lodash 为例:

总结

lerna不负责构建,测试等任务,它提出了一种集中管理package的目录模式,提供了一套自动化管理程序,让开发者不必再深耕到具体的组件里维护内容,在项目根目录就可以全局掌控,基于npm scripts,可以很好地完成组件构建,代码格式化等操作,并在最后一公里,用lerna变更package版本,将其上传至远端。

lerna最佳实践

项目地址: GitHub - Mrrabbitan/virtualList 为了能够使lerna发挥最大的作用,根据这段时间使用lerna 的经验,总结出一个最佳实践。下面是计划实现的一些特性。

工具整合 在这里引入的工具都是为了解决一个问题,就是工程和代码的规范问题。

Happy Hacking~~~
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
夫妻养狗狗把谁当主人 两人同养狗认谁当主人 什么蔬菜和水果可以美容祛斑呢? vivox60怎么查看参数配置详情 怎样查看vivo手机的屏幕参数? vivo手机怎么看手机参数 vi##手机怎么看配置? 义乌到湖州没有直达快客???必须到南浔?? 湖州到绍兴的汽车有几班? 注销驾考需要本人吗 微前端与Monorepo的架构设计 现代前端工程化——探秘 monorepo 仓库管理方式 论述假释的条件 陕西艺术职业学院地址在哪里 陕西艺术职业学院五年制大专的校园环境怎么样 陕西艺术职业学院的学生宿舍怎么样啊? 苹果园市政公园设施配套怎么样?在这附近上班能去这吗? 北京地铁6号线的开通,对周边上班族都有哪些影响? 苹果园这边的夜景怎么样?最近准备约上好友开始夜跑,提前了解一下。_百... 福特翼虎如何检查胎压监测? 电脑显示器超频怎样取消 17款福特翼虎,胎压监测怎么调出来!大神们指点! msi/微星 b75a-g43 gaming主板的oc genie按钮在哪 如何用简单的方法大致判断紫砂壶的品质 隔壁老樊与李莎旻子因即兴弹唱起分歧,他们事后是如何解决的呢? VB6.0 背景音乐与打包 vb6.0 如何在窗体中播放音乐。这代码有什么错~ 为什么会一直打嗝不停 不停地打嗝,而且要打上1小时甚至整天,这是什么原因 余姚出发到武夷山一路有哪几个景点 Lerna:npm多包管理工具 lerna 还是 pnpm + changesets?monorepo 工具核心就看这三个功能_百度... 求几部魔幻电影,就好比哈利波特,加勒比海盗,纳尼亚传奇,神火大盗,指环... ...爱丽丝梦游仙境》《指环王》《加勒比海盗》之类的 想找一些魔幻的大片。指环王,加勒比海盗之类的 求类似于霍比特人 ,加勒比海盗,阿凡达之类的电影!!! ...魔戒、黄金罗盘、纳尼亚、加勒比海盗种大片! ...想找点大片看看,像指环王,加勒比海盗之类的,其他的还有哪些比较惊险... 秦皇岛巧致漂唇做的好吗 秦皇岛巧致能治大脚骨吗 ...样再秦皇岛其他哪做过也行效果怎样秦皇岛哪做的好 ...能根除更好的,进行手术也没有关系,本人是秦皇岛的! 秦皇岛哪里做韩式3点双眼皮好啊 汗管瘤必须去除吗?是不是不做手术的话,会越长越多??? 快乐暑假BOOK下学期五年级综合版答案 QQ空间模板QQ空间模板 好消息!秦皇岛巧致双眼皮手术不花钱了!速来围观 ...名字大全?要没有用过的名字,不要太长,不要繁体字 (听懂了吗)ok... 秦皇岛红血丝可以去根吗 ?哪家医院可以彻底的去根啊?我脸上的红血丝很... 秦皇岛巧致整形医院在给反串女神邹开云做变性手术???!!!