使用Lerna搭建业务组件库

Lerna基本概念

Lerna 是一个用来优化托管在 git\npm 上的多 package 代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目,从而解决了多个包互相依赖,且发布时需要手动维护多个包的问题。
主要功能:

  • 为单个包或多个包运行命令 (lerna run)
  • 管理依赖项 (lerna bootstrap)
  • 发布依赖包,处理版本管理,并生成变更日志 (lerna publish)

关于monorepo

在这里插入图片描述

解决痛点

  • 代码共享,调试便捷: 一个依赖包更新,其他依赖此包的包/项目无需安装最新版本,因为 Lerna 自动 Link
  • 安装依赖,减少冗余:多个包都使用相同版本的依赖包时,Lerna 优先将依赖包安装在根目录
  • 规范版本管理: Lerna 通过 Git 检测代码变动,自动发版、更新版本号;两种模式管理多个依赖包的版本号
  • 自动生成发版日志:使用插件,根据 Git Commit 记录,自动生成 ChangeLog

如何使用

  1. 下载lerna工具
    npm install lerna -g
  2. 新建项目文件
    mkdir lerna-demo 在当前目录下创建文件夹lerna-demo,然后使用命令 lerna init 执行成功后,目录下将会生成这样的目录结构。,一个 hello world级别的 lerna 项目就完成了。
  • packages(目录)
  • lerna.json(配置文件)
  • package.json(工程描述文件)
  1. 模式选择
    • 固定模式:所有包的主版本号和次版本都会使用lerna.json配置里的version字段定义的版本号,如果某一次只修改了其中一个或几个包,但修改了配置文件里的主版本号或次版本号,那么发布时所有的包都会统一升级到该版本并进行发布,单个的包如果想要发布只能修改修订版本号进行发布。
    • 独立模式:每个包使用独立的版本号。
  2. 安装依赖
    yarn add vue@next typescript -W

搭建业务组件库(yarn workspace + Lerna)

能力分工:Lerna 将依赖管理交给 yarn workspace;Lerna 承担依赖发布能力。

使用lerna从零搭建一个 平台基础组件库项目:

  1. 项目初始化
    lerna init
// lerna.json
{
  "packages": [
    "packages/*"  // 表示管理packages下的所有模块
  ],
  "npmClient": "yarn", // 依赖包的安装交给yarn
  "useWorkspaces": true, // 是否使用空间,lerna本身不使用workspace,yarn要使用。
  "version": "0.0.0"
}
//package.json
{
  "name": "root",
  "private": true, // root库作为packages管理角色不需要发布到npm
  "devDependencies": {
    "lerna": "^4.0.0"
  },
  "workspaces": [ //开启Yarn workspaces
    "packages/*"
  ]
}

  1. 子项目创建
    lerna create newProject
  2. 通过yarn安装子项目需要的所有依赖
    yarn installyarn workspace <package-name> [add|remove] <library> [-D|-S]
  3. 使用yarn+workspaces依赖管理
    在sub-package-1、sub-package-1中安装pretty-format,该依赖会被放在对应package的node_modules中。
    再执行yarn install,2个包中相同的pretty-format会被提升到root的node_modules中。
  4. 版本发布
    lerna publish
  5. 配置打包工具rollup,支持按需导入
  6. Storybook开发阶段的调试
  7. 安装必要插件
    • eslint:约束代码风格,以及检测一些潜在错误
    • husky:在git提交前采取强制eslint检查
    • commitlint:commit说明检查,标准格式是三部分:Header(必须)、Body、Footer
    • commitizen:给commit检查交互式输入,方便使用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware Workstation Pro 17虚拟机超级详细搭建(含redis,nacos,docker)(一)

今天从零搭建一下虚拟机的环境&#xff0c;把nacos&#xff0c;redis等微服务组件还有数据库搭建到里面&#xff0c;首先看到的是我们最开始下载VMware Workstation Pro 17 之后的样子&#xff0c;总共一起应该有三部分因为篇幅太长了 下载地址 : VMware - Delivering a Digit…

ElasticSearch首次启动忘记密码,更改密码(Windows 10)

先启动ElasticSearch 启动方式cmd到lasticsearch-8.12.2\bin目录下输入elasticsearch 启动成功后新开一个窗口输入elasticsearch-reset-password -u elastic

34.基于SpringBoot + Vue实现的前后端分离-足球俱乐部管理系统(项目 + 论文)

项目介绍 系统包含用户、教练、管理员三个角色 用户&#xff1a;登录、注册、查看俱乐部公告信息、查看俱乐部赛事信息、个人中心等教练&#xff1a;登录、个人中心、用户管理、赛事管理、球员数据管理、训练计划管理、公告信息管理等管理员&#xff1a;登录、个人中心、教练…

外包干了4年,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

在 GraalVM 静态编译下无侵入实现可观测探索

作者&#xff1a;铖朴、层风 GraalVM 静态编译 背景介绍 随着云原生浪潮的蓬勃发展&#xff0c;利用云原生技术为企业应用提供极致的弹性能力是企业数字化升级的核心诉求。但 Java 作为一种解释执行运行时实时编译的语言&#xff0c;相比于其他静态编译型语言天生具有如下不…

医疗器械-安规之漏电流测量

导致漏电的原因 半导体 PN结在截止时流过的很微小的电流。在D-S设在正向偏置&#xff0c;G-S反向偏置&#xff0c;导电沟道打开后&#xff0c;D到S才会有电流流过。但实际上由于自由电子的存在&#xff0c;自由电子的附着在SIO2和N、导致D-S有漏电流。 电源 开关电源中为了…

2 Spring之IOC详解

文章目录 4&#xff0c;IOC相关内容4.1 bean基础配置4.1.1 bean基础配置(id与class)4.1.2 bean的name属性步骤1&#xff1a;配置别名步骤2:根据名称容器中获取bean对象步骤3:运行程序 4.1.3 bean作用范围scope配置4.1.3.1 验证IOC容器中对象是否为单例验证思路具体实现 4.1.3.2…

AI元年,这5款AI写作能为你提供帮助

自从人工智能技术的迅猛发展以来&#xff0c;AI在各个领域都取得了巨大的进步。其中&#xff0c;AI写作工具成为越来越多人关注的焦点。在这个AI元年&#xff0c;小编想向大家分享5款可能对你有帮助的AI写作工具&#xff0c;如果你也想找AI写作相关的工具&#xff0c;那么来看看…

面试算法-82-不同路径

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; …

分布式ID生成方案总结

分布式场景下&#xff0c;由于通常是分库分表&#xff0c;所以通常无法仅仅使用数据库的自增Id。需要使用其他方案生成唯一的id。目前业界主流的是基于雪花算法或者雪花算法的改进版本。 UUID 有什么特点&#xff1f; 足够的简单&#xff0c;java原生自带。本地生成具有唯一性…

clang-query 的编译安装与使用示例

1&#xff0c;clang query 概述 作用&#xff1a; 检查一个程序源码的抽象语法树&#xff0c;测试 AST 匹配器&#xff1b; 帮助检查哪些 AST 节点与指定的 AST 匹配器相匹配&#xff1b; 2&#xff0c;clang-query 安装 准备&#xff1a; git clone --recursive https://git…

创建和运行任务

任务函数void ATaskFunction(void *pvParameters); 自定义延时函数

【设计】 【数学】1622 奇妙序列

本文涉及知识点 设计 数学 LeetCode1622. 奇妙序列 请你实现三个 API append&#xff0c;addAll 和 multAll 来实现奇妙序列。 请实现 Fancy 类 &#xff1a; Fancy() 初始化一个空序列对象。 void append(val) 将整数 val 添加在序列末尾。 void addAll(inc) 将所有序列中的…

C/C++之内存旋律:星辰大海的指挥家

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、C/C内存分布 我们先来了解一下C/C内存分配的几个区域&#xff0c;以下面的代码为例来看…

NIO简介以及用NIO实现一个群聊系统

一、BIO的工作原理 传统Io(BIO)的本质就是面向字节流来进行数据传输的 ①:当两个进程之间进行相互通信&#xff0c;我们需要建立一个用于传输数据的管道(输入流、输出流)&#xff0c;原来我们传输数据面对的直接就是管道里面一个个字节数据的流动&#xff08;我们弄了一个 by…

Opencascade基础教程(13):读取step文件(方式2)

1、 读取step文件 void COCCDemoDoc::OnButtonImportStep2() {// 设置过滤器 CString szFilter _T("step(*.stp;*.step)|*.stp;*.step||");// 构造打开文件对话框 CFileDialog fileDlg(true, _T("step"), 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,…

一文详解Rust中的字符串

有人可能会说&#xff0c;字符串这么简单还用介绍&#xff1f;但是很多人学习rust受到的第一个暴击就来自这浓眉大眼、看似毫无难度的字符串。 请看下面的例子。 fn main() {let my_name "World!";greet(my_name); }fn greet(name: String) {println!("Hello…

Mysql---备份恢复

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.Mysql日志类型 错误日志&#xff1a; 错误日志主要记录如下几种日志&#xff1a; 服务器启动和关闭过程中的信息 服务器运行过程中的错误信息 事件调度器运行一个时间是产生的信息 在从服…

第十一届蓝桥杯大赛第二场省赛试题 CC++ 研究生组-寻找2020

数据很恶心&#xff0c;但是考点挺友好~ 把测试数据黏贴到记事本中&#xff0c;知测试数据的行列数 然后根据规则判断2020是否出现&#xff0c;并累计其次数即可。 判断可能需要注意超出下标&#xff0c;可以索性把数组定大些。 #include<stdio.h> const int N 310; ch…

校招应该如何准备

校园招聘是大学生进入职场的重要途径之一&#xff0c;请从以下方面去准备校招&#xff0c;通过认真的准备和努力&#xff0c;相信你一定能够在校园招聘中找到理想的工作机会。 1. 简历 简历是应聘过程当中最重要的材料&#xff0c;是我们在求职市场的一张名片&#xff0c;一份…