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
- 在 ui package 中的 package.json 文件中设置
private: true
, npm 不会公布这个包。 - 将 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
- 在 app package 中的 package.json 文件中设置
private: true
, npm 不会公布这个包。 - 将 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 多包治理实际