关于工程化:lerna-简单入门

84次阅读

共计 2608 个字符,预计需要花费 7 分钟才能阅读完成。

Multirepo 模式

单体仓库,即每一个 package 都独自用一个仓库来进行治理。如果不同 package 之间相互依赖,会越来越难以保护。

Monorepo

所有相干的 package 都放在一个仓库里进行治理。

lerna 是什么?

A tool for managing JavaScript projects with multiple packages. 一个用于治理,具备多个package,我的项目的工具。

一个由 lerna 治理的我的项目,通常的构造如下:

- 📃 lerna.json
- 📃 package.json
- 📁 packages
  - 📁 packageA
    - 📃 package.json  
  - 📁 packageB
    - 📃 package.json

lerna Fixed/Locked 模式 (默认模式)

默认的模式,lerna init 创立默认模式的我的项目。固定模式应用 lerna.json 对所有的 package 进行对立的版本治理。多我的项目中任何一个 package 批改都会导致所有 package 的版本号变动。

lerna Independent 模式

独立模式,lerna init --independent 创立独立模式的我的项目。独立模式容许每一个 package 独自批改版本号。在 lerna publish 时, 只会更新有变动的 package 的版本号。

lerna.json

{
  "version": "1.1.3", // 版本号,Independent 模式下设置为 independent
  "npmClient": "npm", // 指定运行命令的客户端
  "command": {
    "publish": {"ignoreChanges": ["ignored-file", "*.md"], // 指定那些目录或者文件的变更不会被 publish
      "message": "chore(release): publish", // 执行公布版本更新时的自定义提交音讯
      "registry": "https://npm.pkg.github.com" // 设置 npm 包公布的注册地址
    },
  },
  "packages": ["packages/*"] // 指定包所在的目录
}

应用 lerna

装置 lerna

npm install --global lerna

初始化 lerna (应用默认模式)

lerna init

我的项目目录构造如下:

- 📁 packages3
- 📃 package.json
- 📃 lerna.json

在我的项目目录中创立三个我的项目

  • app 依赖 ui, utils
  • ui 依赖 utils
  • utils 不依赖任何库,须要公布到 npm 上
lerna create app && lerna create ui && lerna create utils

此时我的项目的文件夹构造,如下图所示:

解决 utils package

utils.js 中简略增加一些示例代码

'use strict';

module.exports = {add};

function add(...args) {console.log('应用 utils 库的的 add 办法')
    let sum = 0
    for (let i = 0; i < args.length; i += 1) {sum += args[i]
    }
    return sum
}

解决 ui package

  1. 在 ui package 中的 package.json 文件中设置 private: true, npm 不会公布这个包。
  2. 将 utils 增加到 ui package 中。lerna add utils --scope=ui

在 ui.js 中应用 utlis

'use strict';

const {add} = require('utils');

module.exports = ui;

function ui(...args) {console.log('调用 ui 函数', ...args);
  add(...args)
}

解决 app package

  1. 在 app package 中的 package.json 文件中设置 private: true, npm 不会公布这个包。
  2. 将 ui 和 utils 增加到 app 中。lerna add ui --scope=app, lerna add utils --scope=app

在 app.js 中 应用 ui 和 utlis

'use strict';

const {add} = require('utils');
const ui = require('ui');

module.exports = app;

function app() {add(1, 2, 3)
    ui(1, 2, 3)
}

app()

运行 app, node app.js。失去,如下的 log

应用 utils 库的的 add 办法
调用 ui 函数 1 2 3
应用 utils 库的的 add 办法

npm 公布

咱们须要把 utils 公布到 npm 上。如果我的项目须要 build。须要提前应用 build 命令对我的项目进行打包。

接下来调用 lerna publish 公布我的项目,因为应用的 Fixed/Locked 模式,所有我的项目的版本号,会依据 lerna.json 中的版本号更新。

抉择版本后,能够看到终端页面如下:

三个 package 的版本号都对立为 0.0.1,而且 app 和 ui 为 private,不会被公布到 npm。

lerna 的命令

lerna init

初始化 lerna 我的项目


# 固定模式
lerna init

# 独立模式
lerna init ----independent

lerna bootstrap

装置所有 package 的依赖。并且连贯本地包的穿插依赖。

lerna create

创立一个在 lerna 治理我的项目中的包。

lerna import

lerna add

将本地或者近程的包作为依赖项增加到 package 中。

lerna add react --scope=app, 在 app 我的项目中增加 react

lerna clean

删除所有 package 的 node_modules 目录。也能够指定删除具体包上面的 node_modules。

lerna clean --scope=ui, 删除 ui 下的 node_modules 目录。

lerna ls

列出所有公开的包(private: true 的除外)

lerna changed

查看自上次公布以来,有那些包产生了更新。

lerna run

在蕴含该命令的每个 package 中执行命令, 也能够指定在某个 package 下执行。

lerna run build --scope=app, 在 app 中执行 build 命令。

lerna publish

公布须要公布的包

参考

  • package.json
  • lerna
  • lerna
  • lerna 多包治理实际

正文完
 0