Lerna入门与实战

news2024/11/24 7:24:05

一、Lerna简介

1.1 lerna背景

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

  • package之间相互依赖,开发人员需要在本地手动执行npm link,维护版本号的更替;
  • issue难以统一追踪,管理,因为其分散在独立的repo里;
  • 每一个package都包含独立的node_modules,而且大部分都包含babel,webpack等开发时依赖,安装耗时冗余并且占用过多空间。

正是在这一需求背景下,babel团队推出的多包管理工具lerna,旨在优化基于Git+npm的多package项目的包管理方式。 像现在流行的vue-cli, create-react-app 等脚手架工具都有用到lerna。lerna是架构优化的产物,而架构优化的主要目标是以提高ROI为核心的多package管理。

作为一种多包依赖解决方案,lerna具体如下特点:

  • 可以管理公共依赖和单独依赖;
  • 多package相互依赖直接内部 link,不必发版;
  • 支持项目的单独发布和全体发布;
  • 多包放一个git仓库,利于代码管理,如配置统一的代码规范;

1.2 两种模式

lerna有两种工作模式,Independent模式和Fixed/Locked模式。这两种模式有什么区别呢?lerna的默认模式是Fixed/Locked mode,在这种模式下,lerna会是把工程当作一个整体来对待,每次发布packges,都是全量发布,无论修改与否。但是在Independent mode下,lerna会配合Git,检查文件变动,只发布有改动的包。

二、快速上手

2.1 安装lerna

使用lerna之前,需要全局安装lerna,安装的命令如下:

yarn global add lerna 
#or     
npm install lerna -g

如果是在已经存在的项目中安装lerna,使用下面的方式:

lerna bootstap

2.2 初始化项目

使用lerna 初始化项目的方式和使用npm方式类似。首先,我们在一个空目录中执行如下初始化命令。

lerna init

默认使用的是固定模式,packages下的所有包共用一个版本号,如果使用独立模式,需要在init后面加一个参数。

lerna init --independent

执行上面的命令后,lerna会创建一个lerna.json配置文件和packages文件夹,此时项目的目录结构如下。

lerna-repo/
  packages/
  package.json
  lerna.json

lerna.json中的packages配置是一个通配符列表,用于匹配包含了package.json的的目录。

2.2.1 lerna.json

其中,lerna.json的文件配置内容如下:

{
  "version": "1.1.3",
  "npmClient": "npm",
  "command": {
    "publish": {
      "ignoreChanges": ["ignored-file", "*.md"],
      "message": "chore(release): publish",
      "registry": "https://npm.pkg.github.com"
    },
    "bootstrap": {
      "ignore": "component-*",
      "npmClientArgs": ["--no-package-lock"]
    }
  },
  "packages": ["packages/*"]
}

下面是部分属性的说明:

  • version:当前版本
  • npmClient:指定运行命令的客户端,设定为"yarn"则使用yarn运行,默认值是"npm"。
  • command.publish.ignoreChanges:通配符的数组,其中的值不会被 lerna 监测更改和发布,使用它可以防止因更改发布不必要的新版本。
  • command.publish.message:执行发布版本更新时的自定义提交消息。
  • command.publish.registry:使用它来设置要发布的自定义注册 url,而非 npmjs.org。
  • command.bootstrap.ignore:运行lerna bootstrap指令时会忽视该字符串数组中的通配符匹配的文件。
  • command.bootstrap.npmClientArgs:该字符串数组中的参数将在lerna bootstrap命令期间直接传递给npm install。
  • command.bootstrap.scope:该通配符的数组会在lerna bootstrap命令运行时限制影响的范围。
  • packages :表示包位置的全局变量数组。

2.2.2 其他命令

除了上面的init命令外,项目使用过程中还会用到很多其他有用的命令。

  • lerna create:此命令的作用是用来创建一个子包名为xx的项目。
  • lerna add:此命令用于安装依赖,格式为lerna add [@version] [–dev]。
  • lerna list:查看当前包名列表。
  • lerna link:将所有相互依赖的包符号链接在一起。
  • lerna exec:在每个包中执行任意命令。
  • lerna run:在每个包中运行npm脚本如果该包中存在该脚本。

2.3 新建模块

接下来,新建moduleA和moduleB两个模块, 并且moduleA需要依赖moduleB。

lerna create module-a
lerna create module-b

在module-a中引入module-b,module-a代码如下。

// module-a
'use strict';
const moduleB = require('module-b');
console.log('moduleB:', moduleB());


module.exports = moduleA;


function moduleA() {
    return 'it's module a';
}

module-b的代码如下。

// module-b
'use strict';


module.exports = moduleB;


function moduleB() {
    return 'it's module b';
}

此时,我们运行node packages/module-a/lib/module-a.js 可能会报错,提示找不到module-b模块,这是因为我们还没在moduleA中安装依赖,需要使用下面的命令安装依赖。

lerna add module-b --scope=module-a

可以看到,module-a node_modules目录下安装了module-b包,重新运行上面的module-a代码会输出如下内容。

$ node packages/module-a/lib/module-a.js                               
moduleB: it's module b

2.4 发布

执行发布的时候,需要Git工具的配合,请确认此时该lerna工程已经连接到Git的远程仓库。如果是第一次发布,可能需要先执行如下命令。

npm login --registry=https://registry.npmjs.org

然后,我们将module-a、module-b进行统一改个名称,比如统一加上@m_alfred前缀。

@m_alfred/module-a
@m_alfred/module-b

然后,执行在输入用户名及密码之后执行发布命令。

lerna publish

发布完成之后,即可在npm仓库看到对应的提交信息。

$ lerna publish
lerna notice cli v3.22.1
lerna info current version 0.0.2
lerna info Looking for changed packages since v0.0.2
? Select a new version (currently 0.0.2) Patch (0.0.3)


Changes:
 - @m_alfred/module-a: 0.0.2 => 0.0.3
 - @m_alfred/module-b: 0.0.2 => 0.0.3


? Are you sure you want to publish these packages? Yes
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna info publish Publishing packages to npm...
lerna info Verifying npm credentials
lerna http fetch GET 200 https://registry.npmjs.org/-/npm/v1/user 1257ms
lerna http fetch GET 200 https://registry.npmjs.org/-/org/m_alfred/package?format=cli 1405ms
lerna info Checking two-factor auth mode
lerna http fetch GET 200 https://registry.npmjs.org/-/npm/v1/user 408ms
lerna success published @m_alfred/module-b 0.0.3
lerna notice 
lerna notice 📦  @m_alfred/module-b@0.0.3
lerna notice === Tarball Contents === 
lerna notice 1.1kB LICENSE        
lerna notice 94B   lib/module-b.js
lerna notice 584B  package.json   
lerna notice 116B  README.md      
lerna notice === Tarball Details === 
lerna notice name:          @m_alfred/module-b                      
lerna notice version:       0.0.3                                   
lerna notice filename:      m_alfred-module-b-0.0.3.tgz             
lerna notice package size:  1.3 kB                                  
lerna notice unpacked size: 1.9 kB                                  
lerna notice shasum:        f530a9abcab3373758574f5b48c6f9eb65788d2a
lerna notice integrity:     sha512-KFEkbN8COpoSj[...]2LRs0hY5U+z2w==
lerna notice total files:   4                                       
lerna notice 
lerna http fetch PUT 200 https://registry.npmjs.org/@m_alfred%2fmodule-b 3077ms
lerna success published @m_alfred/module-a 0.0.3
lerna notice 
lerna notice 📦  @m_alfred/module-a@0.0.3
lerna notice === Tarball Contents === 
lerna notice 1.1kB LICENSE        
lerna notice 177B  lib/module-a.js
lerna notice 620B  package.json   
lerna notice 116B  README.md      
lerna notice === Tarball Details === 
lerna notice name:          @m_alfred/module-a                      
lerna notice version:       0.0.3                                   
lerna notice filename:      m_alfred-module-a-0.0.3.tgz             
lerna notice package size:  1.3 kB                                  
lerna notice unpacked size: 2.0 kB                                  
lerna notice shasum:        27a2413b6761b76548ac199aa2df0377768715f5
lerna notice integrity:     sha512-2H1QB5FdRaAuR[...]p7RYrOI2QdjSQ==
lerna notice total files:   4                                       
lerna notice 
lerna info lifecycle root@undefined~publish: root@undefined
lerna http fetch PUT 200 https://registry.npmjs.org/@m_alfred%2fmodule-a 6363ms


> root@undefined publish /Users/alfred/workspace/jack-bean/lerna-example
> lerna publish


lerna notice cli v3.22.1
lerna info current version 0.0.3
lerna notice Current HEAD is already released, skipping change detection.
lerna success No changed packages to publish 
Successfully published:
 - @m_alfred/module-a@0.0.3
 - @m_alfred/module-b@0.0.3
lerna success published 2 packages

发布成功后,单独修改moduleB代码,然后再执行发布命令。

Changes:
 - @m_alfred/module-a: 0.0.3 => 0.0.4
 - @m_alfred/module-b: 0.0.3 => 0.0.4

可以看到,module-a版本也升级了,这是由于我们l在初始化erna init的时候使用的是默认的Fixed mode模式,所以packages下所有包都会使用同一版本号。

2.5 共用devDependencies

在开发过程中,很多模块都会依赖babel、eslint等模块,这些大多都是可以共用的。此时,我们可以通过lerna link convert命令将各个包package.json中共同的devDependencies移动到根目录的package.json中,将它们提升到项目根目录中,这样做的好处有:

  • 所有包使用相同版本的依赖,统一管理;
  • 可使用自动化工具让根目录下的依赖保持更新;
  • 减少依赖的安装时间,一次安装,多处使用;
  • 节省存储空间,安装在根目录的node_module下。

三、工作过程总结

下面是使用lerna的完整工作流程图。
在这里插入图片描述
参考:http://www.febeacon.com/lerna-docs-zh-cn/routes/basic/about.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据驱动运营成功案例——内蒙古国大药房

国药控股国大药房内蒙古有限公司(以下简称“内蒙古国大药房”),自2003年成立以来,销售额以每年35%以上的速度增长,现有直营门近400家,分布覆盖呼和浩特、包头、呼伦贝尔、乌兰察布、巴彦淖尔、赤峰、满洲里…

新加坡国立大学尤洋:我的四个选择,本质的喜欢催动长久的坚持丨青源专栏...

为了启发青年学者思考职业发展,激发科研灵感,智源社区推出青源专栏,定期邀请青源会员分享他们的研究思考和科研感悟。新加坡国立大学计算机系校长青年教授、青源会会员尤洋分享了他在高性能计算研究、创业经历以及在新加坡的生活所感。从求学…

006. 分割回文串

1.题目链接: 131. 分割回文串 2.解题思路: 2.1.题目要求: 给一个字符串 s ,要求把 s 分割成一些子串,并使每个子串都是 回文串。 回文串的概念:正反顺序都一样的字符串。 举例: 输入&#…

IC模拟版图工程师高薪进阶之路,三年实现年薪30w+

模拟版图是模拟IC设计岗位的一种,随着国内半导体行业的不断发展,岗位的需求也越来越多。而每个芯片最终能够付诸于生产都离不开模拟版图设计师的功劳,所以目前芯片产业对于这类人才需求越来越大。 什么是模拟版图设计工程师? 模…

BSA牛血清白蛋白修饰Fe3O4纳米颗粒 BSA-MION

产品名称:BSA牛血清白蛋白修饰Fe3O4纳米颗粒 英文名称:BSA-MION 用途:科研 状态:固体/粉末/溶液 产品规格:1g/5g/10g 保存:冷藏 储藏条件:-20℃ 储存时间:1年 牛血清中的简单蛋白&am…

2022年第十一届认证杯数学中国数学建模国际赛小美赛:D题野生动物贸易是否应该长期禁止建模方案及代码实现

更新进展 (1)2022-12-2 9:00 发布预售 (2)2022-12-2 10:40 发布建模思路、代码以及参考文献 (3)待更新内容:进一步对全部数据分析 1 题目 野生动物市场被怀疑是当前疫情和2002年SARS疫情的…

blender中的灯光和相机

灯光环境光灯光基础灯光基本属性 EV渲染器日光面光天空盒IES灯光 (灯光遮罩)自发光移动摄像机切换摄像机摄像机属性环境光 在渲染视图中,没有任何光时,物体只受环境光的影响 灯光基础 1 四种灯光,点光,…

安卓期末大作业——仿番茄免费小说APP

《移动应用开发实践》实践报告 APP名称: 番茄免费小说 要求: 格式:宋体,小四号字;首行缩进;行距:1.5倍。 每人独立完成Android App的设计与开发App必须包含SOLite数据库操作 一、所调查的Ap…

Android -- 每日一问:能讲讲 Android 的 Handler 机制吗?

典型回答 讲清楚Android中的消息机制,先表述一下和Handler相关的一些类: Message:消息分为硬件产生的消息(如按钮、触摸)和软件生成的消息; MessageQueue:消息队列的主要功能向消息池投递消息(MessageQueue.enqueueMe…

疫情下为什么年轻、未婚女性更容易拿到offer

最近发现一个奇怪的现象,为什么会奇怪。大家别着急,容我慢慢道来。由于疫情开始后,也是大家开始躺平后,企业在有意、无意的疯狂裁员,导致人心惶惶,大家都不敢轻易跳槽了。甚至有的人很庆幸,有份…

一文弄懂JUnit5相关注解

JUnit5 JUnit是Java生态系统中最流行的单元测试框架之一。JUnit5版本包含许多令人兴奋的创新,其目标是支持Java8和更高版本中的新功能,并支持多种不同风格的测试。 Maven依赖 启动JUnit5.x.0非常简单;我们只需要将以下依赖项添加到pom.xml…

昆石网络 VOS3000虚拟运营支撑系统任意文件读取漏洞

漏洞描述: 昆石网络 VOS3000虚拟运营支撑系统 通过 %c0%ae%c0%ae 等字符绕过检测,可导致任意文件读取漏洞。 漏洞利用条件: 对⽤户查看或下载的⽂件没有限制或者限制绕过,就可以查看或下载任意⽂件 漏洞影响范围: VOS3000 漏…

阿里云Redis性能压力测试(二十)

文章目录1.云Redis性能压力测试2.安装redis-banchmark压测工具3.压测两节点的Redis集群4.压测四节点的Redis集群4.1.扩容集群为四节点4.2.压力测试5.压测结果对比1.云Redis性能压力测试 我们当前Redis集群是2个节点2个分片,使用redis-benchmark工具对Redis集群进行…

轨迹预测——day 57 基于车道交叉和考虑驾驶方式的终点生成模型的前目标车辆轨迹预测

Trajectory Prediction of Preceding Target Vehicles Based on Lane Crossing and Final Points Generation Model Considering Driving Styles导读II.问题表述与系统架构A. Trajectory Prediction for PTVs(preceding target vehicles)B. Position and…

python自学程序练习01:99乘法表

#完成99乘法表 #1*11 #1*22 2*24 #1*33 2*36 3*39 #很明显要两个循环print(打印99乘法表:) for i in range(1,10):for j in range(1, i1):print(f{j}*{i}{j * i}, end )结果如上图所示,很明显发现,是我们想要的数据但是他的形式需要有所修改。…

Vue3创建项目(四)main.js配置,避坑指南

系列文章目录 第一篇 Vue3创建项目(一)新手教程 第二篇 Vue3创建项目(二)router路由配置和使用 第三篇 Vue3创建项目(三)Vuex配置 目录 系列文章目录 main.js配置,直接看图,如下…

作为前端你还不懂MutationObserver?那Out了

🐱个人主页:不叫猫先生 🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏&#xff…

Netty(一)- Netty与BIO、NIO、AIO介绍

文章目录一、Netty的介绍二、Netty的应用场景1. 互联网行业2. 游戏行业3. 大数据领域三、I/O模型1. Java BIO(1)Java BIO 基本介绍(2)Java BIO 工作机制(3)Java BIO 应用实例(4)Java…

css如何快速将网站设置为灰色背景

突然想起写这篇文章是因为,公司的产品大早上打电话说:“赶紧,业务刚通知,我们的官网、小程序、公众号的首页需要变为灰色背景,最好在10点半之前上线”。当时心有千般不愿,但最后生活压倒我坚硬的脊梁。哈哈…

关于《web课程设计》网页设计 用html css做一个漂亮的网站 仿新浪微博个人主页

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…