当前位置: 代码迷 >> 综合 >> Lerna 多包存储库管理工具
  详细解决方案

Lerna 多包存储库管理工具

热度:5   发布时间:2024-01-11 20:27:01.0

 

年后会开发一个很有挑战性的项目,在这个项目进行之前,需要做一些技术上的前期准备。

首当其冲的就是项目的组织和管理。通常,我们在开发前端项目时都是单个包的,也就是只有一个package.json文件以及一个node_modules文件夹。单个包项目的优点不言而喻,简单,可靠,便于管理。但是,当一个大的项目库代码量剧增之后,管理起来就是一件比较麻烦的事情,为了方便代码的共享,就需要将代码库拆分成独立的包。Lerna便是优化和管理JS多包项目的利器。

lerna的项目结构长这样:

multi-packages/package.jsonpackages/package-1/package.jsonpackage-2/package.json

packages文件夹就是用来承载多个项目的目录。

lerna项目中最常用到的命令是lerna bootstrap和lerna publish。lerna bootstrap用于为所有项目安装依赖,类似于npm i/yarn ; lerna publish用于提交对项目的更新。基于以上两点,需要在项目中使用npm和git。

为了使用lerna,需要全局安装lerna:

npm i -g lerna

yarn global add lerna

lerna安装完成之后,就需要使用lerna 初始化项目,使用(在使用该命令前,应该已经使用git init初始化过该项目):

lerna init

这个时候lerna会在自动项目下生成packages文件夹和lerna.json文件,并在package.json文件中的devDependencies字段中生成lerna对应的依赖信息。

使用lerna管理项目时,可以选择两种模式。默认的为固定模式(Fixed mode),当使用lerna init命令初始化项目时,就默认为固定模式,也可以使用 lerna init --independent 命令初始化项目,这个时候就为独立模式(Independent mode)。固定模式中,packages下的所有包共用一个版本号(version),会自动将所有的包绑定到一个版本号上(该版本号也就是lerna.json中的version字段),所以任意一个包发生了更新,这个共用的版本号就会发生改变。而独立模式允许每一个包有一个独立的版本号,在使用lerna publish命令时,可以为每个包单独制定具体的操作,同时可以只更新某一个包的版本号。

然后这里介绍一下lerna add 命令,其命令签名是:

lerna add <package>[@version] [--dev]

该命令用于为packages文件夹下的package安装依赖。该命令有许多的用法,通常说来有如下几种,还是以前面的文件夹为例,其目录结构如下:

multi-packages/package.jsonpackages/package-1/package.jsonpackage-2/package.json
  1. lerna add babel , 该命令会在package-1和package-2下安装babel
  2. lerna add react --scope=package-1 ,该命令会在package-1下安装react
  3. lerna add package-2 --scope=package-1,该命令会在package-1下安装package-2

从上面的三个实例看出,使用lerna add 可以指定为某一个或所有的包安装依赖,依赖可以为外部(通过npm install的方式),也可以为内部(即packages文件夹下的包),同时当指定的内部依赖版本号跟目标版本号不匹配时,将使用npm install的方式来安装外部依赖。

然后就是最重要的lerna publish了,用于发布更新,运行该命令会执行如下的步骤:

  1. 运行lerna updated来决定哪一个包需要被publish
  2. 如果有必要,将会更新lerna.json中的version
  3. 将所有更新过的的包中的package.json的version字段更新
  4. 将所有更新过的包中的依赖更新
  5. 为新版本创建一个git commit或tag
  6. 将包publish到npm上

同时,该命令也有许多的参数,例如--skip-git 将不会创建git commit或tag,--skip-npm将不会把包publish到npm上。

lerna updated/lerna diff 对包是否发生过变更

lerna ls,显示packages下的各个package的version

lerna clean 清理node_modules

lerna run 运行npm script,可以指定具体的package