相信不少同窗都遇到过一个问题:随着 js 项目愈来愈大,许多公用的功能与组件每每会被拆分,打包,发布成为单独的 npm 包来使用,而在此过程当中,每每会遇到很多问题:vue
npm link
或者git submodule
,适用性和观感不好commit log
分散在各个仓库中,问题溯源成本大大提高这时候,聪明的同窗就会想到,咱们把全部的代码所有移到一个仓库里去不就行了吗?是的,程序员的力量是无穷的,业界已经为咱们提供了至关成熟的解决方案,那就是用: lerna 来管理你的仓库react
有阅读源码习惯的同窗可能已经对 lerna 再也不陌生,例如 react,vue 等等大型项目都已经在开发环境中使用 lerna 来管理 npm 包git
Lerna 是一种工具,能够优化使用 git 和 npm 管理多包仓库的工做流程。程序员
将大型代码库分红单独的独立版本化的软件包对于代码共享很是有用。可是,跨仓库进行更改很麻烦且难以跟踪,而且跨仓库的测试变得很是复杂。为了解决这些(以及许多其余)问题,某些项目会将其代码库组织到多包存储库中。Babel,React,Angular,Ember,Meteor,Jest 等项目以及许多其余项目都在单个仓库中开发了全部软件包。
github
首先全局安装 lernaweb
npm install --global lerna
复制代码
接下来新建一个 git 仓库npm
mkdir my-new-monorepo && cd my-new-monorepo
复制代码
初始化 lerna 和 gitjson
lerna init
git init
复制代码
进行完这个步骤后,仓库应该大体长这样:bootstrap
my-new-monorepo/
package.json
lerna.json
packages/
package-1/
package.json
package-2/
package.json
复制代码
在导入任何子模块以前,lerna要求仓库至少有一次提交,因此咱们能够先运行数组
git add .
git commit -m 'init monorepo'
复制代码
接下来,就是见证奇迹的时刻,你只须要根据你的每一个子项目分别运行
lerna import ~/path/to/your/subproject
复制代码
剩下的都由 lerna 来为你搞定!包括迁移代码,迁移 git 提交日志,将他们移动到 packages/目录下,并修改lerna.json
若是import遇到问题,能够尝试
lerna import --flatten ~/path/to/your/subproject
仓库添加完毕以后运行 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: