04lerna简介

146 阅读2分钟

lerna简介

lerna

原生脚手架开发痛点分析

  • 痛点一:重复操作
    • 多Package本地link
    • 多Package依赖安装
    • 多Package单元测试
    • 多Package代码提交
    • 多Package代码发布
  • 痛点而:版本一致性
    • 发布时版本一致性
    • 发布后相互依赖升级

Package越多,管理复杂度越高


lerna简介

Lerna is a tool that optimizes the workflow around managing multi-package repositories with git and npm.


lerna 是一个优化基于git+npm的多package项目的管理工具

优势

  • 大幅减少重复操作
  • 提升操作的标准化

Lerna 是架构优化的产物,它揭示了一个架构真理:项目复杂度提升,就需要对项目进行架构优化架构优化的主要目标往往都是以效能为目标。

官网:

lerna.js.org

案例🌰

使用lerna管理的大型项目:

lerna开发脚手架流程

lerna脚手架初始化.drawio

基于lerna创建项目

  • 安装lerna

    npm install -g -lerna
    
  • 创建项目

    git init your-cli-dir & cd your-cli-dir
    
  • 初始化lerna项目

    lerna init
    
  • 创建Package

    lerna create @your-cli/core packages
    
  • 安装依赖

    lerna add mocha packages/core --dev
    
  • 删除依赖

    lerna clean
    
  • 安装依赖

    lerna bootstrap
    
  • 执行单元测试

    lerna run test
    
  • 执行特定包的单元测试

    lerna run test @your-cli-dir/core
    
  • link项目

    lerna link
    
  • 发布项目

    lerna publish
    

Lerna 使用细节

  • lerna init:
    • 会自动化完成git初始化,但不会创建.gitignore,这个必须要手动添加,否则会将node_modules目录都上传到git,如果node_modules已经加入git stage,可使用

      git reset HEAD <file>
      

      执行unstage操作,如果文件已经被git监听到变更,可使用

      git checkout -- <filename>
      

      将变更作废,记得在执行操作之前将文件加入.gitignore

  • lerna add:
    • 第一个参数:添加npm包名

    • 第二个参数:本地package路径

    • 选项

      • --dev:将依赖安装到 devDependencies,不加时安装到dependencies

        lerna add <package> [loc] dev		
        
  • lerna link:
    • 如果未发布上线,需要手动将依赖添加到 package.json再执行 lerna link

  • lerna clean
    • 只会删除 node_modules不会删除 package.jsom中的依赖
  • lerna execlerna run
    • --scope属性后添加包名,而不是package路径,这点和 lerna add用法不同
  • lerna publish
    • 发布时会自动执行:git add package-lock.json,所以package.json不要加入 .gitignore

    • 先建远程仓库,并且同步一次master分支

    • 执行 lerna publish前请先完成 npm login

    • 如果发布的 npm 包名为 @xxx/yyy格式,需要先在npm注册名为:xxx的organization,否则可能会提交不成功

    • 发布到 npm group 时默认为 private,所以需要在 package.json中添加如下配置:

      "publishConfig":{
        "access":"public"
      }