Lerna 多包存储库管理工具

 

年后会开发一个颇有挑战性的项目,在这个项目进行以前,须要作一些技术上的前期准备。前端

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

lerna的项目结构长这样:react

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

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

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

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

npm i -g lerna

json

yarn global add lerna

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

lerna init

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

使用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.json
  packages/
    package-1/
      package.json
    package-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

相关文章
相关标签/搜索