如今就開始用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

相關文章
相關標籤/搜索