A tool for managing JavaScript projects with multiple packages.
Lerna 是一个用来优化托管在git\npm上的多package代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目,从而解决了多个包互相依赖,且发布时需要手动维护多个包的问题
目前越来越多优秀的开源框架, 库使用了lerna进行管理, 比如:babel,create-react-app
github:https://github.com/lerna/lerna
使用场景
在日常业务中,开发UI组件库、Util工具库以及插件库等场景
通常,我们在开发前端项目时都是单个包的,也就是只有一个package.json文件以及一个node_modules文件夹。
单个包项目的优点不言而喻,简单,可靠,便于管理
但是,当一个大的项目库代码量剧增之后,管理起来就是一件比较麻烦的事情,为了方便代码的共享,就需要将代码库拆分成独立的包
当管理多个npm包时, 通常会遇到以下问题:
package之间相互依赖,开发人员需要在本地手动执行npm link,手动维护版本号的更替
发布繁琐, 多个package之间可能存在相互依赖, 多工程切换, 更新版本号
每一个package都包含独立的node_modules,而且大部分都包含babel,webpack等开发时依赖,安装耗时冗余并且占用过多空间
issue难以统一追踪,管理,因为其分散在独立的repo里。
Getting Started
安装
> npm install --global lerna
初始化
> $ mkdir lerna-repo
> $ cd lerna-repo
> $ lerna init
这会创建一个包含 lerna.json 配置文件的目录, 如以下项目结构:
项目结构:
multi-packages/
lerna.json
package.json
packages/
package-1/
package.json
package-2/
package.json
开发多个新包(实战)
现有a@1.0.0, b@1.0.0 packages, a依赖于b
1. 先升级b的版本为1.0.1
> npm version patch
2. 在a中添加b未发布的本地新版本
> lerna add b@1.0.1 --scope=a
3. 开发调试完成后发布 a@1.0.1, b@1.0.1
> lerna publish
如果a为私库版本, 在package.json中添加
```
"publishConfig": {
"registry": "http://10.1.6.28"
}
```
即, a@1.0.1发布到`http://10.1.6.28`, b@1.0.1发布到`https://registry.npmjs.org`
如果 package.json 设置了 prepublishOnly scripts, 则发布前会调用, 比如测试
npm document`https://docs.npmjs.com/misc/registry`
常用命令行
lerna init
> $ lerna init
1. 如果lerna尚不存在,则将lerna添加为package.json中的devDependency
2. 创建lerna.json配置文件以存储版本号
--independent, -i
> $ lerna init --independent
这会告诉lerna使用集中版本号或独立版本号模式
bootstrap
> $ lerna bootstrap
1. npm安装每个包的所有外部依赖项。
2. 将所有彼此依赖的Lerna包Symlink。
3. npm在所有bootstrapped包中运行prepublish。
4. npm 在所有bootstrapped包中预先运行准备。
执行 lerna bootstrap 该操作会自动为 module-a 进行 npm install 和 npm link 操作
add
>`$ lerna add
[@version] [--dev]`
将本地或远程包作为依赖项添加到当前Lerna存储库中的包
1. Add package to each applicable package. Applicable are packages that are not package and are in scope
2. Bootstrap packages with changes to their manifest file (package.json)
这对本地开发非常有用, 我们可以同时开发几个依赖包, 并在本地应用, 测试, 共同发布
publish
> $ lerna publish
* 运行lerna的更新版本以确定哪些软件包需要发布.
* 如有必要,请增加lerna.json中的版本密钥.
* 将所有更新包的package.json更新为新版本.
* 用新的版本更新所有更新包的依赖关系,并使用脱字号(^)指定.
* 为新版本创建一个新的git提交和标记.
* 发布更新的包到npm.
Lerna不会发布标记为私有的包 ("private": true in the package.json).
lerna link
> $ lerna link
> $ lerna link --force-local
更多命令请访问: https://github.com/lerna/lerna
领取专属 10元无门槛券
私享最新 技术干货