使用lerna优雅地管理多个package

使用lerna优雅地管理多个package

背景

对于维护过多个package的同学来说,都会遇到一个选择题, 这些package是放在一个仓库里维护还是放在多个仓库里单独维护, 数量较少的时候,多个仓库维护不会有太大问题,但是当package数量逐渐增多时,一些问题逐渐暴露出来:

  • package之间相互依赖,开发人员需要在本地手动执行 npm link ,维护版本号的更替。
  • issue难以统一追踪,管理,因为其分散在独立的repo里。
  • 每一个package都包含独立的 node_modules ,而且大部分都包含 babel , webpack 等开发时依赖,安装耗时冗余并且占用过多空间。

解决

上述提到的多package项目,实际上是比较常见的,在日常业务中,开发UI组件库、Util工具库以及插件库等场景会和上述仓库类似。接下来,我们来看一下几个明星仓库的目录结构。

根据上述截图,我们可以发现这些仓库之间的共性:

  • 均使用单个仓库来管理多个package
  • 多个package之间可能存在相互依赖的情况

为了降低多package项目的维护成本,我们使用lerna作为流程管理工具。

使用lerna提升开发流程体验

接下来,我们从一个demo出发,了解基于lerna的开发流程。

项目初始化

我们需要维护一个UI组件库,其包含2个组件,分别为House(房子)和Window(窗户)组件,其中House组件依赖于Window组件。
我们使用lerna初始化整个项目,并且在 packages 里新建了2个 package ,执行命令进行初始化:

lerna init

初始化化后目录结构如下所示:

.
├── lerna.json
├── package.json
└── packages
    ├── house
    │   ├── index.js
    │   ├── node_modules
    │   └── package.json
    └── window
        ├── index.js
        ├── node_modules
        └── package.json

增加依赖

接下来,我们来为组件增加些依赖,首先House组件不能只由Window构成,还需要添加一些外部依赖(在这里我们假定为lodash)。我们执行:

lerna add lodash --scope=house

这句话会将 lodash 增添到House的 dependencies 属性里,这会儿你可以去看看 package.json 是不是发生变更了。
我们还需要将Window添加到House的依赖里,执行:

lerna add window --scope=house

就是这么简单,它会自动检测到window隶属于当前项目,直接采用 symlink 的方式关联过去。

symlink:符号链接,也就是平常所说的建立超链接,此时House的node_modules里的Window直接链接至项目里的Window组件,而不会再重新拉取一份,这个对本地开发是非常有用的。

发布到npm

接下来我们只需要简单地执行 lerna publish ,确认升级的版本号,就可以批量将所有的package发布到远程。

默认情况下会推送到系统目前npm对应的registry里,实际项目里可以根据配置 leran.json 切换所使用的npm客户端。

更新模块

接下来,我们变更了Window组件,执行一下 lerna updated ,便可以得知有哪些组件发生了变更。

→ lerna updated
lerna info version 2.9.1