前端架构: 脚手架包管理工具之lerna的全流程开发教程
Lerna
1 )文档
- Lerna 文档
- https://www.npmjs.com/package/lerna
- https://lerna.js.org [请直达这个链接]
- 使用 Lerna 帮助我们做包管理,并不复杂,中间常用的命令并不是很多
- 这里是命令直达:https://lerna.js.org/docs/api-reference/commands
2 )使用
- 现在我们开始使用 Lerna, 首先创建目录 lerna
- 安装并查看 lerna 版本 $
npx lerna -v
这里没有安装,会自动安装 lerna - 目前lerna的版本是8.1.2
- 在 lerna 这个目录下执行 $
npx lerna init
- 这时候,项目初始化完成了,就会多处一个 lerna.json 这个是lerna配置文件
- 现在基于 lerna 创建 a包 $
npx lerna create a
一路回车 - 现在出现了 packages/a 包,里面有一系列配置
- 同workspace使用一致,在使用a的时候,把a加到分组中, 修改 a/package.json中的name
"name":"@somegroup/lerna-a"
, 并且把 a/lib/a.js 修改成 a/lib/index.js- 同步 a/package.json 中
"main": "lib/index.js",
同时修改成ESM的形式"type":"module"
- 修改 a/lib/index.js 的代码
'use strict';export default function() {return 'Hello from a'; }
- 这样,a包就调试好了, 可以在 lerna/package.json 中看到
"workspaces": ["packages/*" ],
- 这里的worksapces 使用了通配符*的方式
- 不同于 npm的workspace添加依赖的方式,lerna提供的方式是:$
npx lerna add -h
- 注意,这里 The “add” command was removed by default in v7, and is no longer maintained.
- 所以,新提供的方式是: https://lerna.js.org/docs/legacy-package-management#replacing-your-usage-of-lerna-add
- 现在给a包添加chalk依赖: $
npm i chalk -w @somegroup/lerna-a
注意这里a包的name变化了,所以安装方式也要如此 - 这里,a包就绪之后,就可以着手创建b包了,在创建的时候,可以看下一些辅助参数 $
npx lerna create -h
- 可以看到常用的有
--access When using a scope, set publishConfig.access value [可选值: "public", "restricted"] [默认值: public] --bin Package has an executable. Customize with --bin <executableName> [默认值: <name>] --es-module Initialize a transpiled ES Module [布尔]
- 这样,在创建b包的时候,就可以这样 $
npx lerna create b --access public
回车,注意name配置为:@somegroup/lerna-b - 创建 cli 包的时候,就可以这样 $
npx lerna create cli --access public --bin --es-module
回车,注意name配置为:@somegroup/lerna-cli - 对于b包
- 修改 b/lib/b.js 为 b/lib/index.js, 同时修改 b/package.json 中的
"main": "lib/index.js"
和"type": "module"
- 注意,这里和 cli包的区别在于生成b包的时候
--es-module
没有添加,所以要手动添加这个"type": "module"
- 注意,这里和 cli包的区别在于生成b包的时候
- 修改 b/lib/index.js 的内容
'use strict';export default function () {return 'Hello from b'; }
- 修改 b/lib/b.js 为 b/lib/index.js, 同时修改 b/package.json 中的
- 对于 cli 包
-
修改 cli/package.json 中的 bin属性为:
"bin": { "lerna-cli": "bin/cli.js" }
, main属性"main":"src/cli.js"
-
修改 cli/bin/cli.js 中
#!/usr/bin/env node'use strict';import cli from '../src/cli.js';cli().parse(process.argv.slice(2));
-
修改 src/cli.js
import factory from 'yargs/yargs';export default function cli(cwd) {const parser = factory(null, cwd);parser.alias('h', 'help');parser.alias('v', 'version');parser.usage("$0","TODO: description",yargs => {yargs.options({// TODO: options});});return parser; }
-
- 回到最外层 lerna 目录,尝试连接下:
npx lerna link
,发现报错- 报错内容为:The “link” command was removed by default in v7, and is no longer maintained.
- 解决方案:https://lerna.js.org/docs/legacy-package-management#replacing-your-usage-of-lerna-bootstraplerna-link
- 使用 $
npm i -ws
这样,三个包都会在 lerna/node_modules/@somegroup 组中会被同步,这样可以替代之前lerna的link命令npm i -ws
是更新所有 workspaces 中的依赖
- 现在在 lerna/package.json 中的最外层加上一个 cli 的 scripts
{"scripts": {"cli": "lerna-cli"} }
- 执行 $
npm run cli
- 这样,cli 包就可以直接在 lerna 目录下执行了, 验证
- $
npm run cli -v
得到 10.2.3 这里得到的是 npm 的版本
- $
- 至此,基于 lerna 的脚手架的功能框架完成,目前并没有提供什么实质的功能
- 现在,要在 cli 包中使用a包和b包,在 lerna 目录下,执行 $
npm i @somegroup/lerna-a @somegroup/lerna-b -w packages/cli
- 在 lerna/packages/cli/bin/cli.js 中使用
#!/usr/bin/env node'use strict';import cli from '../src/cli.js'; import a from '@somegroup/lerna-a'; import b from '@somegroup/lerna-b';console.log(a()); console.log(b());cli().parse(process.argv.slice(2));
- 执行 cli,$
npm run cli
可以看到,打印出了a, b包中的方法提供的字符串

3 )测试
- 使用 lerna 添加测试脚本 $
npx lerna run test
它会把 packages 目录中所有 test 脚本全部执行 - 如果要单独测试某个包,比如a包,修改
packages/a/__tests__
目录下的 a.test.js'use strict';import a from '../lib/index.js'; import assert from 'assert';const { strict } = assert;assert.strictEqual(a(), 'Hello from a'); console.info('a tests passed');
- 这时候,在 packages/a 下执行 $
npm run test
测试通过 - 同样,packages/* 下的所有包都可以这样修改后,执行测试用例
4 )发布
- 发布前的再次检查
- 每个包的版本都要注意同步检查,发布的时候,不要有错误
- 发布的配置检查,在 package.json 中
"publishConfig": { "access": "public" }
都要有 - 提交代码到远程仓库后(必须)
- 所有事项准备完成,就可以执行发布的流程了,执行 $
npx lerna publish
- 这里有步骤,可以选择下一个版本,填入必要信息或选项
- 选择之后,本地packages下包的每个版本都会帮忙升级,非常方便
5 )验证
- 发布完成后,可以本机全局安装我们的
@somegroup/lerna-cli
工具了 - $
npm i -g @somegroup/lerna-cli@latest
或者指定版本号 - 再执行 $
lerna-cli
就可以运行我们的脚手架了 - 这样基于lerna开发的脚手架就已经完成了
相关文章:

前端架构: 脚手架包管理工具之lerna的全流程开发教程
Lerna 1 )文档 Lerna 文档 https://www.npmjs.com/package/lernahttps://lerna.js.org [请直达这个链接] 使用 Lerna 帮助我们做包管理,并不复杂,中间常用的命令并不是很多这里是命令直达:https://lerna.js.org/docs/api-referen…...
[安洵杯 2019]easy_serialize_php1
打开题目 题目源码: <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user&q…...

【前端素材】推荐优质在线通用果蔬商城电商网页eStore平台模板(附源码)
一、需求分析 1、系统定义 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。它将不同种类的新鲜水果、蔬菜、干果、坚果等聚集在一起,为消费者提供方便、快捷的购物渠道。 2、功能需求 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。…...
开源软件的商业模式探析:开放与盈利的平衡
写在开头 开源软件的概念和应用已经成为了现代科技领域中的一个重要组成部分。然而,虽然开源软件的价值和影响力得到了广泛认可,但如何在开放的环境中找到商业盈利的平衡却是一个颇具挑战性的问题。本文将深入探讨开源软件的商业模式,从基本…...

使用全局事件总线实现任意组件间的通讯
本文以vue2中爷孙组件通讯为例,需求是点击孙组件的按钮,实现关闭爷组件的弹窗。 全局事件总线是通过Vue实例的事件系统来实现组件之间的通讯,可以方便地在任何组件中进行事件的触发和监听。 以下是使用全局事件总线实现爷孙组件通讯的步骤&a…...

文件基础和文件fd
文章目录 预备知识C语言的文件接口系统调用文件fd 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。 预备知识 我们平时说文件就是说文件里…...

3dgs学习(二)—— 3d高斯与协方差矩阵及其几何意义
协方差矩阵与3d高斯 3d高斯与椭球与协方差矩阵 3d高斯,及3维空间内的正态分布。 通过一元正态分布的坐标系图像不难想象,3维空间中的正态分布点集中在一片椭球空间中,各方向长轴取决于各方向正态分布的方差。 而协方差矩阵通过计算多元之…...
ZStack Cube超融合入选IDC《中国超融合基础架构市场评估》报告
近日,IDC发布了《中国超融合基础架构市场评估,2023》。IDC针对中国超融合基础架构市场的发展现状展开了调研,明确了最终用户构建融合型云平台的痛点和难点,阐述了市场中各技术服务提供商的服务方案和优势,并对未来中国…...

每日一题——LeetCode1556.千位分隔符
方法一 个人方法: 把n转为字符串,逆序遍历n,把n的每个元素加入res,每三次加入.,最后将res翻转再转为字符串即为符合题目要求的结果 var thousandSeparator function(n) {nlet res[],lenn.length-1for(let ilen;i>…...

8.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-游戏底层功能对接类GameProc的实现
内容参考于:易道云信息技术研究院VIP课 上一个内容:通过逆向分析确定游戏明文接收数据过程 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:bcf7559184863febdcad819e48aa…...

Redis冲冲冲——事务支持,AOF和RDB持久化
目录 引出Redis事务支持,AOF和RDB持久化1、Redis的事务支持2、Redis的持久化 Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Redis冲冲冲——事务支持,AOF和RDB持久化 Redis事务支持,AOF和…...
路由菜单路径匹配方法
优化路由菜单路径匹配算法:实现获取整条线路的路径 引言 在前端开发中,路由菜单的路径匹配是一个常见的需求。我们经常需要根据给定的路径,找到对应的菜单项,并获取整条线路的路径。本文将介绍一个优化的路由菜单路径匹配算法&…...

设计模式浅析(九) ·模板方法模式
设计模式浅析(九) 模板方法模式 日常叨逼叨 java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁 模板方法模式 概念 模板方法模式(Template Method Pattern)在Java中是…...

无用工作、UBI与AI
有些隐晦和黑暗的事实无法陈述,因为任何的系统中“无用”的结局都是被无情的抛弃和淘汰,AI监督下的人类结局更是如此。 什么是无用工作? 无用无效工作通常指的是那些看似忙碌但实际上对社会或个人没有实质性贡献的工作。这类工作可能包括以下…...

【监控】grafana图表使用快速上手
目录 1.前言 2.连接 3.图表 4.job和path 5.总结 1.前言 上一篇文章中,我们使用spring actuatorPrometheusgrafana实现了对一个spring boot应用的可视化监控。 【监控】Spring BootPrometheusGrafana实现可视化监控-CSDN博客 其中对grafana只是打开了一下&am…...
Django常用命令
一、新建一个新项目 django-admin startproject project_name二、新建一个app 在Django中的一个app代表一个功能模块。开发者可以将不同功能的模块放在不同的app中, 方便代码的复用。 python manage.py startapp appa_name三、数据迁移(更新数据库) 编写好了Model后&#x…...

【center-loss 中心损失函数】 原理及程序解释(更新中)
文章目录 前言问题引出open-set问题抛出 解决方法softmax函数、softmax-loss函数解决代码(center_loss.py)原理程序解释 如何梯度更新首先了解一下基本的梯度下降算法然后 前言 学习一下: 中心损失函数,用于用于深度人脸识别的特…...
什么是 HTTPS 证书?作用是什么?
HTTPS 证书,即超文本传输安全协议证书(Hypertext Transfer Protocol Secure),是网站安全的关键组成部分。它通过 SSL/TLS 加密协议,确保用户与网站之间的数据传输是加密和安全的。 什么是 HTTPS 证书? HT…...

为什么软考报名人数越来越多?
2020年软考报名人数404666人,广东省报考人数超过14万人。 ●2021年软考通信考试报名人数突破100万人,估计软考有90多万。 ●2022年软考通信考试共129万人,估计软考占了120多万人。 ●2023年软考具体报名人数没有公布,但工业和信…...

【投稿优惠|快速见刊】2024年图像,机器学习和人工智能国际会议(ICIMLAI 2024)
【投稿优惠|快速见刊】2024年图像,机器学习和人工智能国际会议(ICIMLAI 2024) 重要信息 会议官网:http://www.icimlai.com会议地址:深圳召开日期:2024.03.30截稿日期:2024.03.20 (先…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
计算机系统结构复习-名词解释2
1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...

NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地
NineData 的数据库 DevOps 解决方案已完成对百度智能云向量数据库 VectorDB 的全链路适配,成为国内首批提供 VectorDB 原生操作能力的服务商。此次合作聚焦 AI 开发核心场景,通过标准化 SQL 工作台与细粒度权限管控两大能力,助力企业安全高效…...