• 如何使用lerna进行多包(package)管理


    为什么要用lerna

    将大型代码仓库分割成多个独立版本化的 软件包(package)对于代码共享来说非常有用。但是,如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪,并且, 跨越多个代码仓库的测试将迅速变得非常复杂。

    为了解决这些(以及许多其它)问题,某些项目会将 代码仓库分割成多个软件包(package),并将每个软件包存放到独立的代码仓库中。但是,例如 Babel、 React、Angular、Ember、Meteor、Jest 等项目以及许多其他项目则是在 一个代码仓库中包含了多个软件包(package)并进行开发。

    Lerna 是一种工具,针对 使用 git 和 npm 管理多软件包代码仓库的工作流程进行优化

    npm初始化

    新建文件夹spring-breeze,在集成终端输入
    npm init -y
    根目录会生成package.json:

    {
      "name": "spring-breeze",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    
    

    安装lerna

    全局安装lerna
    执行:npm i lerna -g
    安装完成后执行:lerna init
    执行完成后后出现这样的目录结构

    - packages(目录)
    - lerna.json(配置文件)
    - package.json(工程描述文件)
    

    初始化两个package

    默认情况下,package是放在packages目录下的.创建包可以使用命令lerna create [loc]
    lerna create core packages/core
    lerna create core packages/tools

    将packages/core/lib/core.js改为:

    'use strict';
    console.log("我是core包~~")
    

    将packages/tools/lib/tools.js改为:

    'use strict';
    console.log("我是tools包~~")
    

    此时目录结构为

    -- packages(目录)
      -- core
        ...
        -- lib
          -- core.js
        -- package.json 
        -- README.md
      - tools
        ...
        -- lib
          -- tools.js 
        -- package.json 
        -- README.md
    - lerna.json(配置文件)
    - package.json(工程描述文件)
    ...
    

    修改包名

    为了防止重名,包名一般改为@组织/包,如现在这个项目core应该改为:@spring-breeze/core;tools改为:@spring-breeze/tools

    例如core模块:

    • packages/core/package.json:
    {
      "name": "@spring-breeze/core",
      "version": "0.0.1",
      "description": "> TODO: description",
      "author": "******",
      "homepage": "",
      "license": "ISC",
      "main": "lib/core.js",
      "directories": {
        "lib": "lib",
        "test": "__tests__"
      },
      "files": [
        "lib"
      ],
      "repository": {
        "type": "git",
        "url": "******"
      },
      "scripts": {
        "test": "echo \"Error: run tests from root\" && exit 1"
      }
    }
    
    

    安装第三方包lerna add

    • 添加公共依赖

      在根目录下执行(在哪个目录执行都一样):lerna add lodash
      此时会发现core和tools都被安装了lodash

    • 添加单独依赖

      lerna add jquery --scope=core
      core就会被安装了jquery

    删除依赖lerna clean

    执行lerna clean会删除所有包中的node_modules

    安装所有依赖lerna bootstrap

    执行lerna bootstrap会重新安装所有依赖

    测试本地包

    如果本地开发的两个包有所关联,用lerna进行调试非常的简单,只需要将需要用的本地包版本号写入依赖执行:lerna link就可以了;例如在core模块使用tools模块

    • package添加依赖:"@spring-breeze/tools": "^0.0.1"
    {
      "name": "@spring-breeze/core",
      "version": "0.0.1",
      "description": "> TODO: description",
      "author": "******",
      "homepage": "",
      "license": "ISC",
      "main": "lib/core.js",
      "directories": {
        "lib": "lib",
        "test": "__tests__"
      },
      "files": [
        "lib"
      ],
      "repository": {
        "type": "git",
        "url": "******"
      },
      "dependencies": {
        "@spring-breeze/tools": "^0.0.1"
      },
      "scripts": {
        "test": "echo \"Error: run tests from root\" && exit 1"
      }
    }
    

    添加完成之后执行lerna link

    • core中使用:packages/core/lib/core.js
    'use strict';
    require("@spring-breeze/tools")
    
    

    node执行core.js就会发现控制台打印:我是tools包~~。这样就可以进行本地的调试了

    发布前准备

    调试完成就可以发布了,发布流程如下:

    • 注册npm账户
    • 新建组织spring-breeze(根据自己项目而定)
    • 执行npm login
    • 分别在core和utils下的package.json中配置
     "publishConfig": {
        "access": "public"
      }
    
    • 新建gitignore
    *node_modules
    
    • 新建git仓库,将项目git remote add "你的git仓库",并且提交项目至git仓库
    git remote add https://gitee.com/geeksdidi/spring-breeze.git  
    git add .   
    git commit -m "初始化"
    git push -u origin master
    
    • 新建LICENSE.md(可以是空文件)
    • 修改一个文件执行 lerna publish

    注意:每次发布新版本之前都有将代码提交到git上

    查看已发布的package

    登陆npm官网 即可看到自己发布的package

  • 相关阅读:
    windows ubuntu子系统,肿瘤全外篇1.安装软件及建立数据库
    Python抽象类
    RTL8762DK RTC(五)
    c++模板初阶
    前端实现文件下载的方法
    [LiteratureReview]A Collaborative Visual SLAM Framework for Service Robots
    超级鹰的使用
    解决typescript报错:不能将类型xxx分配给类型xxx
    Vue + Element-UI —— 项目实战(六)
    性能测试-基础篇
  • 原文地址:https://www.cnblogs.com/zdsdididi/p/16394289.html