一步步学习如何用Lerna

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pwc1996/article/details/86559619

前话

Lerna是啥,干嘛用的,有什么好处,这里我引用官方的一段说明:

将大型代码库拆分成独立版本的包对于代码共享非常有用。然而,跨多个存储库进行更改是混乱的,很难跟踪,跨存储库的测试变得非常复杂。

为了解决这些(以及许多其他)问题,一些项目将把它们的代码库组织到多包存储库(有时称为monorepos)中。像Babel、React、Angular、Ember、Meteor、Jest等项目,以及许多其他项目在一个存储库中开发它们的所有包。
Lerna是一个工具,它优化了使用Git和NPM管理多包存储库的工作流。

Lerna还可以减少开发和构建环境中对大量包副本的时间和空间需求,这通常是将项目划分为多个单独的NPM包的缺点。

我举个场景来简单说明,Babel相信大多数人都用,这是个大型的开源项目,包含了core、preset和炒鸡多的plugin包等等。

Babel6及以前的做法是,这些plugin包都是独立,版本号也独立维护,因此如果一次版本发布的时候,如果要统一版本号,就需要所有包都要写changlog,git pushnpm publish一次,这显然是个繁琐复杂而且容易出错的过程(虽然有脚本可以解决)。

那么有没有什么好的解决方案呢?Lerna举手回答了。

Babel7开始,为了规范统一管理,采用了Lerna管理项目,因此我们在Babel仓库中可以看到packages这个目录和Lerna的配置信息,它包含了所有官方的包,很显然解决了每个包都git push的问题(直接在根目录统一提交)。有人也许会举手问了,那每个包都npm publish这个可以解么?

当然!Lerna有个命令就是干这样的事情,直接在根目录敲下命令lerna publish,Lerna就自动地变更版本号,填写message,根目录git push与所有包自动npm publish

下面我简单说下怎么用。

开始

Lerna官网在这里https://lernajs.io/,仓库在这里https://github.com/lerna/lerna,可先查看官方详细的文档说明。

0x00.几个重要的命令

Lerna有很多强大的CLI命令,我这里用的有:

  • lerna init: 初始化项目
  • lerna bootstrap: 自动构建项目
  • lerna ls: 列出当前项目所有包
  • lerna clean: 清理node_modules文件夹
  • lerna add: 添加依赖(类似npm install)
  • lerna publish: 发版

0x01.初始化项目

因为lerna publish是集合了git pushnpm publish的操作,因此我们需要将项目文件夹连接到git仓库和登录npm仓库(我这里就假设读者熟悉gitnpm操作)。

从git仓库clone下来新建的项目(可在github或者gitlab创建)并且添加基本的文件,目录如下:

my-lerna-demo
|--- .gitignore
|--- README.md

这是我们在根目录中执行命令lerna init就可以初始化项目了,此时目录如下:

my-lerna-demo
|--- packages #包目录
|--- .gitignore
|--- lerna.json #lerna配置
|--- package.json
|--- README.md

然后我们使用lerna publish提交一次试试,执行如下命令:

> git add *
> git commit -m "init" #执行lerna publish前需提交记录此次变更
> lerna publish

lerna notice cli v3.10.5
lerna info current version 0.0.0
lerna info Looking for changed packages since initial commit.
lerna success No changed packages to publish

如上输出信息可见,因为我们并没有创建包,因此上面操作并没有成功发版。

下面我们创建第一个包。

0x02.第一个包

我们在packages新建目录my-lerna-module并且在该目录使用命令npm init初始化后随意添加一些文件,此时目录结构如下:

my-lerna-demo
|--- packages
     |--- my-lerna-module
          |--- package.json
          |--- index.js
|--- .gitignore
|--- lerna.json #lerna配置
|--- README.md

然后我们再次尝试发版,执行命令和输出内容如下:

> git add *
> git commit -m "add package my-lerna-module" #执行lerna publish前需提交记录此次变更
> lerna publish

lerna notice cli v3.10.5
lerna info current version 0.0.0
lerna info Looking for changed packages since initial commit.
? Select a new version (currently 0.0.0) (Use arrow keys)
> Patch (0.0.1)
  Minor (0.1.0)
  Major (1.0.0)
  Prepatch (0.0.1-alpha.0)
  Preminor (0.1.0-alpha.0)
  Premajor (1.0.0-alpha.0)
  Custom Prerelease
  Custom Version

此时Lerna给了我们版本号的选项,小beta版本就选第一个吧(此后每次变更都会递增版本号,递增位数可选)

? Select a new version (currently 0.0.0) Patch (0.0.1)

Changes:
 - my-lerna-module: 1.0.0 => 0.0.1

? Are you sure you want to publish these packages? (ynH)

此时列举并询问是否发布这些包(也就是npm publish操作),直接输入y,此时输出以下信息表示Lerna成功执行了发版操作。

......

Successfully published:
 - [email protected]
lerna success published 1 package

此时查看git仓库和npm仓库可以看到如下结果:

01

02

到这里我们就使用Lerna踏出了第一步。

0x03.添加依赖

我们再创建个包my-lerna-index,并且初始化,此时目录结构如下:

my-lerna-demo
|--- packages
     |--- my-lerna-module
          |--- package.json
          |--- index.js
     |--- my-lerna-index
          |--- package.json
          |--- index.js
|--- .gitignore
|--- lerna.json #lerna配置
|--- README.md

我们使用命令lerna add给包添加依赖,命令如下:

> lerna add cross-env #所有包都添加cross-env依赖
> lerna add my-lerna-module --scope=my-lerna-index #给包my-lerna-index添加my-lerna-module依赖

此时我们看到my-lerna-modulemy-lerna-indxpackage.json都添加了如下依赖配置:

  "dependencies": {
    "cross-env": "^5.2.0"
  }

其中,my-lerna-index添加了对my-lerna-module的依赖配置:

  "dependencies": {
    "cross-env": "^5.2.0",
    "my-lerna-module": "^0.0.1"
  }

然后我们再次发布个小版本:

> git add *
> git commit -m "add package my-lerna-index" #执行lerna publish前需提交记录此次变更
> lerna publish

lerna notice cli v3.10.5
lerna info current version 0.0.1
lerna info Looking for changed packages since v0.0.1
? Select a new version (currently 0.0.1) Patch (0.0.2)

Changes:
 - my-lerna-index: 1.0.0 => 0.0.2
 - my-lerna-module: 0.0.1 => 0.0.2

? Are you sure you want to publish these packages? Yes

......

Successfully published:
 - [email protected]
 - [email protected]
lerna success published 2 packages

此时我们成功发布了个小版本0.0.2。

0x04.其他命令

使用命令lerna ls列举当前项目所有包:

> lerna ls

lerna notice cli v3.10.5
my-lerna-index
my-lerna-module
lerna success found 2 packages

如果想清理项目下所有包的node_modules目录,我们可以使用命令lerna clean

> lerna clean

lerna notice cli v3.10.5
lerna info Removing the following directories:
lerna info clean packages\my-lerna-index\node_modules
lerna info clean packages\my-lerna-module\node_modules
? Proceed? Yes

......

lerna success clean finished

执行命令lerna bootstrap则自动更新包的依赖信息至最新并且自动下载依赖包:

> lerna bootstrap

lerna notice cli v3.10.5
lerna info Bootstrapping 2 packages
lerna info Installing external dependencies
lerna info Symlinking packages and binaries
lerna success Bootstrapped 2 packages

后话

《一步步学习如何使用Lerna》到这里就结束了,本人只做了简单的案例说明(其实这是我刚学的哈),如果存在错误的地方还请大佬指出,谢谢您的阅读与支持。

猜你喜欢

转载自blog.csdn.net/pwc1996/article/details/86559619