前端架构: 脚手架包管理工具之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 (先…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
