如今就开始用lerna来管理你的npm包吧~

前言

相信不少同窗都遇到过一个问题:随着 js 项目愈来愈大,许多公用的功能与组件每每会被拆分,打包,发布成为单独的 npm 包来使用,而在此过程当中,每每会遇到很多问题:vue

  1. 如需修改拆分的包每每会须要npm link或者git submodule,适用性和观感不好
  2. commit log分散在各个仓库中,问题溯源成本大大提高
  3. 包发布须要去各个仓库操做,至关繁琐
  4. 最经常使用的包改动后会影响大量依赖此包的项目,(ps 改动 package.json 等),有时候还有会遗漏

这时候,聪明的同窗就会想到,咱们把全部的代码所有移到一个仓库里去不就行了吗?是的,程序员的力量是无穷的,业界已经为咱们提供了至关成熟的解决方案,那就是用: lerna 来管理你的仓库react

有阅读源码习惯的同窗可能已经对 lerna 再也不陌生,例如 react,vue 等等大型项目都已经在开发环境中使用 lerna 来管理 npm 包git


什么是 lerna

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 的命令

  • lerna init: 如其名
  • lerna bootstrap: 初始化仓库中的全部 package,包括安装依赖,运行 preinstall,postinstall script 等等
  • lerna import: 导入一个本地存在的仓库成为一个新的 package
  • lerna 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 列举该仓库中全部公开可见的 package
  • lerna run [script] 等同于在全部 package 中运行npm run [script],前提是该 script 存在

lerna.json 配置

  • version: 当前 npm 包的版本
  • npmClient: 默认是 "npm".
  • command.publish.ignoreChanges: 在运行lerna changedlerna publish时会被忽略的 glob 匹配项,用来防止由于修改例如README.md后生成一个新版本
  • command.publish.message: 一个在发布新版本时会做为前缀添加到 commit 消息的配置项
  • command.publish.registry: 指定发布到的 npm 源
  • command.bootstrap.ignore: 一个记录 bootstrap 过程当中哪些 package 会被忽略的 glob 匹配项数组
  • command.bootstrap.npmClientArgs: 会做为参数传给 npm 客户端, 例如--no-package-lock
  • packages: lerna 用来标注 package 的 glob 匹配项数组, 默认为packages/*

懒癌患者的救星

若是你以为记得这么多的配置项和命令实在太难了,lerna-wizard就是你的救星。且看 demo:


潜在问题/缺陷

  • 为项目添加了一层额外的复杂度,开发者须要了解 monorepo 的概念和 lerna 的使用
  • 没有一个可用的 dry-run 选项,没法在不往 npm 发布包的状况下测试整个 publish 流程
  • 定义不一样 npm 包之间公用的生命周期脚本比较困难
  • 仅改动一小部分代码也须要克隆整个 monorepo 和安装全部依赖

原文地址 @serializedowen

相关文章
相关标签/搜索