相信很多同学都遇到过一个问题:随着 js 项目越来越大,许多公用的功能与组件往往会被拆分,打包,发布成为单独的 npm 包来使用,而在此过程中,往往会遇到不少问题:
npm link
或者git submodule
,适用性和观感很差commit log
分散在各个仓库中,问题溯源成本大大提升这时候,聪明的同学就会想到,我们把所有的代码全部移到一个仓库里去不就好了吗?是的,程序员的力量是无穷的,业界已经为我们提供了相当成熟的解决方案,那就是用: lerna 来管理你的仓库
有阅读源码习惯的同学可能已经对 lerna 不再陌生,例如 react,vue 等等大型项目都已经在开发环境中使用 lerna 来管理 npm 包
Lerna 是一种工具,可以优化使用 git 和 npm 管理多包仓库的工作流程。
将大型代码库分成单独的独立版本化的软件包对于代码共享非常有用。但是,跨仓库进行更改很麻烦且难以跟踪,并且跨仓库的测试变得非常复杂。为了解决这些(以及许多其他)问题,某些项目会将其代码库组织到多包存储库中。Babel,React,Angular,Ember,Meteor,Jest 等项目以及许多其他项目都在单个仓库中开发了所有软件包。
首先全局安装 lerna
npm install --global lerna
接下来新建一个 git 仓库
mkdir my-new-monorepo && cd my-new-monorepo
初始化 lerna 和 git
lerna init
git init
进行完这个步骤后,仓库应该大致长这样:
my-new-monorepo/
package.json
lerna.json
packages/
package-1/
package.json
package-2/
package.json
接下来,就是见证奇迹的时刻,你只需要根据你的每个子项目分别运行
lerna import ~/path/to/your/subproject
剩下的都由 lerna 来为你搞定!包括迁移代码,迁移 git 提交日志,将他们移动到 packages/目录下,并修改lerna.json
仓库添加完毕之后运行 lerna bootstrap
来安装项目依赖
lerna init
: 如其名lerna bootstrap
: 初始化仓库中的所有 package,包括安装依赖,运行 preinstall,postinstall script 等等lerna import
: 导入一个本地存在的仓库成为一个新的 packagelerna add [package]
:添加所有子项目都可用的共同依赖lerna publish
:打包发布所有的 package
--npm-tag [tagname]
用指定的 npm tag 发布包,默认为 latest--canary 或 -c
发布一个 canary(测试)版本--skip-git
不执行任何 git 命令--force-publish [packages]
强制发布数组中列举的 package,用逗号分割,或者*
来发布所有包lerna changed
查看和上次发布相比哪些 package 产生了改动lerna ls
列举该仓库中所有公开可见的 packagelerna run [script]
等同于在所有 package 中运行npm run [script]
,前提是该 script 存在
lerna changed
和lerna publish
时会被忽略的 glob 匹配项,用来防止因为修改例如README.md
后生成一个新版本--no-package-lock
packages/*
如果你觉得记得这么多的配置项和命令实在太难了,lerna-wizard就是你的救星。且看 demo: