前言:lerna 作为一个风靡的前端 monorepo 管理工具,在许许多多的大型项目中都得到的实践,现在笔者在公司中开发的 monorepo 工具中,monorepo 中子项目的发包能力就是基于 lerna 在上一篇文章中介绍完了 lerna version 的运行机制后,那么在本篇文章中我将继续介绍一下 lerna 发包机制中最关键的一个 command 即 lerna publish。 现在我们来继续介绍 lerna publish 运行机制,作为发包机制中的最后决定性的一个指令,lerna publish 的做的工作其实很简单,就是将 monorepo 需要发布的包,发布到 npm 同样 lerna publish 也分为几种不同的场景去运行: lerna publish # lerna version + lerna publish from-git lerna publish 总结 本文从源码角度剖析了一下 lerna publish 的执行机制,对于一些边界的 corner case 有些删减,按照主线讲解了 lerna publish 是怎么完成 lerna monorepo
lerna 发包设计到两个比较关键的指令分别为 lerna version 和 lerna publish 这两个指令。 因为篇幅原因,我将分为两个系列去分别介绍这两个指令,本篇文章将从 lerna version 开始,在下篇中我会介绍一下 lerna publish 的工作原理,相信在我介绍完成之后,大家都会对 lerna lerna version 本身在 lerna 中是一个很重要的指令,有许多其他的指令例如在 lerna 中 two primary commands 之一的 lerna publish 都是基于该指令进行相关的工作 那我们直接开始来看一下 lerna version 的具体实现,具体源码地址为: https://github.com/lerna/lerna/tree/main/commands/version lerna version 的工作原理,在使用 lerna 进行发包相关的操作的时候,lerna version 起到了一个很重要的作用,如果单独使用 lerna publish,一般选项情况下也是会首先进到 lerna
lerna lerna 是一个管理工具,用于管理包含多个软件包(package)的 JavaScript 项目。 lerna 的最佳实践。 基本用法 安装 $ npm install --global lerna 创建一个git仓库 $ git init lerna-repo && cd lerna-repo 初始化一个 lerna 仓库 初始化之后的工程目录结构如下: lerna-repo ├── lerna.json ├── package.json └── packages lerna.json: { 发布 以上包确认没有问题之后,就可以通过执行 lerna publish 进行发布了。 在进行 publish 之前需要首先提交你的代码,否则 lerna 会报错: lerna ERR!
二、快速上手 2.1 安装lerna 使用lerna之前,需要全局安装lerna,安装的命令如下: yarn global add lerna #or npm install lerna - g 如果是在已经存在的项目中安装lerna,使用下面的方式: lerna bootstap 2.2 初始化项目 使用lerna 初始化项目的方式和使用npm方式类似。 lerna list:查看当前包名列表。 lerna link:将所有相互依赖的包符号链接在一起。 lerna exec:在每个包中执行任意命令。 $ lerna publish lerna notice cli v3.22.1 lerna info current version 0.0.2 lerna info Looking for changed > lerna publish lerna notice cli v3.22.1 lerna info current version 0.0.3 lerna notice Current HEAD
一直感觉异常麻烦,又说不出来哪里不对,原来是源码组织方式带来的困扰 三.lerna试玩 // 安装 npm install lerna -g git init hoho-lerna && cd hoho-lerna // 初始化目录结构 lerna init 得到如下结构: hoho-lerna/ packages/ lerna.json package.json 创建module: mkdir packages /hoho-lerna-core && cd packages/hoho-lerna-core npm init 这样最终会得到一堆package: packages/ hoho-lerna-core Yes lerna info publish Publishing packages to npm... lerna info published hoho-lerna-module-b lerna info published hoho-lerna-core lerna info published hoho-lerna-module-a lerna info git Pushing tags...
lerna 4.0.0 DEMO 目录 root/ lerna.json lerna 配置 package.json packages/ npm包集合 pkg-ts npm 子包 pkg-es6 安装 lerna 将为我们生成基础的项目目录和配置. lerna init ? // 方式二 直接配置lerna.json // lerna.json { ... , 例如我们之前为使用lerna 管理的独立npm包, 导入到lerna项目包集合后, 可以使用改目录导入相关 git 记录等 lerna import <包地址> 参数: --faltten lerna 造成git add 发生冲突 参考文档 深入 lerna 发包机制 —— lerna publish-技术圈 @lerna/version(翻译) @lerna/publish(翻译) 深入 lerna
这是第 137 篇不掺水的原创 Lerna 运行流程剖析 https://www.zoo.team/article/lerna-js 前言 随着前端组件、包库等工程体系发展,业务组件和工具库关系越来越复杂 多业务组件、互相依赖、无法复用 发包流程复杂、版本管理痛苦 此刻就有了 lerna.js 简介 “Lerna (lerna) is a tool that optimizes the workflow 原理剖析 我们先 Github 克隆源码(https://github.com/lerna/lerna) 观察一下目录 指令的初始化流程 脚手架入口文件位于 /core/lerna/cli.js “ core/lerna/cli.js 入口 #! */ // 导入 @lerna/cli 文件 const cli = require("@lerna/cli"); // .....
2.1 初始化项目结构 首先就是得全局安装 Lerna: yarn global add lerna // or npm install lerna -g 然后就是新建项目目录,并使用 Lerna 初始化一个基本结构 mkdir dyboy-lerna-project cd dyboy-lerna-project/ lerna init --independent 如此之后,便得到了如下的一个文件目录结构: . ├── lerna.json // lerna 的配置文件 ├── package.json // 当前项目的描述文件 └── packages/ // 存放所有包的文件夹 Lerna 初始化项目的时候 2.2 Lerna + Yarn Workspaces Lerna 默认会使用 NPM 作为包管理器,但使用 yarn 作为 Lerna 的默认包管理器是更推荐的方式。 Lerna 方案补齐短板,如虎添翼。
Lerna 是啥? 图:基于 Lerna 的 Monorepo项目结构 ? 图文无关 ? 下面给大家展示一个 基于 Lerna 的 Monorepo 项目 完整的构建、开发、发布流程 深刻体会它的优势 3.1. 全局安装 lerna; npm install -g lerna 03. 初始化 lerna 项目; lerna init 图:lerna init 命令 ? 构建各子项目间的依赖关系; lerna bootstrap 图:lerna bootstrap 命令 ? 图:lerna bootstrap 连接后效果 ? 3.3. 《syncpack 小工具》: https://github.com/JamieMason/syncpack Lerna git 仓库: https://github.com/lerna/lerna
Lerna 安装依赖的方式 Lerna 安装依赖的方式,是使用命令lerna bootstrap。 Yarn workspace 与 Lerna 结合 结合的方式 配置 lerna.json { ... Lerna 负责版本的发布工作,对 package 相互之间的依赖,做好版本管理。 自动设置软链接,方便调试Yarn 的 workspace 会自动对 package 的引用,设置 symlink 所有 package 使用同一个 yarn.lock,更少造成冲突且易于审查 使用 首次安装依赖 lerna
Lerna很好的管理多个包以及他们的依赖关系。 1.工作模式: Lerna允许我们使用两种模式来管理我们的模块:Fixed 模式和Independent模式。 5.初始化项目: 首先,先建一个新项目,接着我们全局安装lerna,并执行初始化操作,再上传到git仓库上: npm intall lerna -g mkdir lerna-demo && cd $_ 8.Lerna指令 安装依赖 lerna bootstrap 查看本地包列表 lerna list 删除安装依赖 lerna clean 建立软链 lerna link 发布安装包 lerna publish 创建一次lerna工作流 从lerna boostrap(依赖包安装) --> 开发模块 --> git commit --> lerna changed(查看包变化) --> lerna publish lerna bootstrap // 安装依赖包 lerna list // 本地依赖包 lerna changed // 待发布包列表 lerna publish // 发布 9
多包管理器 安装 npm i lerna -g 命令 init 项目初始化 lerna init // 默认初始化 lerna init --independent // 使用独立版本模式 lerna init --exact init 生成目录 packages/ // 默认包目录 package.json lerna.json // lerna 配置 bootstrap 为所有包安装依赖 lerna bootstrap add 添加依赖, 类似 npm install lerna add <package> // 为所有包安装依赖 lerna add <package> --scope // 执行所有包内的 test 命令 lerna run --scope=root dev // 只执行root包内的 dev 命令 create 创建新包 lerna create pk-name 的基础使用 使用lerna优雅的管理多个package
认识lerna 导读:本章节主要讲解Lerna是什么,Lerna有什么用,如何使用Lerna进行npm包管理,大厂的Lerna版本管理策略是怎么做的,Lerna是如何实现本地包依赖管理以及底层原理是什么 lerna是如何实现内部文件软链的?是npm link么? lerna在哪些场景下使用会比较优势? lerna如何安装依赖,如何更新,如何发布?lerna如何提升安装性能? Lerna配置 lerna 环境搭建 npm i lerna -g // 全局安装lerna lerna init // 初始化lerna目录 lerna.json基础配置 Lerna基本操作 本小节会介绍lerna基本操作命令,如何创建一次lerna的工作流。lerna的常用命令:list, bootstrap, clean, changed, publish。 如何安装依赖 lerna bootstrap 如何查看本地包列表 lerna list 如何删除安装依赖 lerna clean 如何建立软链 lerna link 如何发布安装包 lerna publish
lerna-lite 介绍 lerna-lite 是用来管理和发布同一仓库多 JavaScript/TypeScript 包的一款工具,与 lerna 相比 lerna-lite 具有更轻量化和模块化的特点 ,同时 lerna-lite 也是 lerna 的一个有限子集。 快速开始: 首先要将@lerna-lite/cli作为开发依赖安装到项目中: # 创建一个空项目 mkdir lerna-repo cd lerna-repo npm init -y # 安装 cli 依赖并执行 init 命令 npm install -D @lerna-lite/cli node_modules/.bin/lerna init 执行 init 命令初始化工作空间,得到一个 lerna.json lerna-lite notice cli v3.3.3 lerna-lite info current project version 0.0.0 lerna-lite info Assuming
Lerna 的优点: 高效执行任务:Lerna 可以以最高效、正确的顺序并行运行任意数量的项目命令,还可以在多台机器上分布执行。 Lerna 的使用: 以下是使用 Lerna 的步骤: 初始化项目 Lerna:在项目根目录中运行以下命令: npx lerna init 会创建一个名为 lerna.json 的配置文件。 运行 Lerna 命令:现在你可以运行其他 Lerna 命令,例如安装依赖、发布等。 常见问题: lerna publish 报错: lerna notice cli v3.22.1 lerna ERR! 这是因为没有初始化 Lerna,和上面讲到的一样,执行命令: npx lerna init lerna init 报错: lerna notice cli v8.1.2 lerna ERR!
在没使用 lerna 时, 我们不同库的组织形式可能如下: 使用 lerna 之后的库组织结构: 以上两个是我做的简图, 基本可以对比出使用 lerna 前后的差异, lerna 的作用是把多个项目或模块拆分为多个 publish 依赖git检测文件改动,自动发布,管理版本号 lerna create 创建一个 lerna 管理的package包 lerna clean 删除所有包下面的node_modules目录 当然 lerna 还提供了很多有用的命令, 大家感兴趣可以在官网学习. 接下来我就带大家从零搭建一个使用 lerna 管理的多包项目. 上图是我们包的依赖关系, 首先我们需要全局安装一下 lerna. 项目初始化 $ git init best-cps && cd best-cps $ lerna init 复制代码 创建三个 package $ lerna create LibA && lerna
如果大家想看实际的案例, 可以参考: best-cps | 基于lerna + dumi搭建的多包管理实践 大型项目中如何管理组织依赖包及其版本问题 这个问题主要用我上面的提到的 lerna 工具来解决 在没使用 lerna 时, 我们不同库的组织形式可能如下: 使用 lerna 之后的库组织结构: 以上两个是我做的简图, 基本可以对比出使用 lerna 前后的差异, lerna 的作用是把多个项目或模块拆分为多个 publish 依赖git检测文件改动,自动发布,管理版本号 lerna create 创建一个 lerna 管理的package包 lerna clean 删除所有包下面的node_modules目录 当然 lerna 还提供了很多有用的命令, 大家感兴趣可以在官网学习. 接下来我就带大家从零搭建一个使用 lerna 管理的多包项目. 项目初始化 $ git init best-cps && cd best-cps $ lerna init 创建三个 package $ lerna create LibA && lerna create
Lerna 的优点: 高效执行任务:Lerna 可以以最高效、正确的顺序并行运行任意数量的项目命令,还可以在多台机器上分布执行。 Lerna 的使用: 以下是使用 Lerna 的步骤: 初始化项目 Lerna:在项目根目录中运行以下命令: npx lerna init 会创建一个名为 lerna.json 的配置文件。 运行 Lerna 命令:现在你可以运行其他 Lerna 命令,例如安装依赖、发布等。 常见问题: lerna publish 报错: lerna notice cli v3.22.1 lerna ERR! 这是因为没有初始化 Lerna,和上面讲到的一样,执行命令: npx lerna init lerna init 报错: lerna notice cli v8.1.2 lerna ERR!
什么是lerna?为什么要使用lerna? lerna到底是什么呢?lerna官网上是这样描述的。 npm config ls lerna 你需要全局安装lerna工具。 npm install lerna -g 初始化一个lerna工程 在这个例子中,我将在我本地d:/ 根目录下初始化一个lerna工程。 在d:/ 下创建一个空的文件夹,命名为lerna-demo mkdir lerna-demo 初始化 通过cmd进入相关目录,进行初始化 cd d:/lerna-demo lerna init 执行成功后 lerna最佳实践 为了能够使lerna发挥最大的作用,根据这段时间使用lerna 的经验,总结出一个最佳实践。下面是一些特性。
其实了解 Lerna 用法的同学都知道,这里只用 Lerna 的命令lerna bootstrap可以完美的解决这个问题,但在这里,我使用 Yarn workSpace 代替 npm,除了保证 package Yarn workspace 是 Lerna 利用的底层机制,而且 Lerna 支持与 Yarn 协同工作。 项目初始化 lerna 初始化项目(采用 independent 管理模式) lerna init --independent 新增 packages lerna create @tencent/pkg1lerna 我们可以通过在 lerna 发布之前调用 lerna run build 来实现这一点,这将运行每个 package 的build脚本。 或者我们可以使用 lerna 发布命令lerna publish。