相信不少同窗都遇到過一個問題:隨着 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: