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多包治理实际