背景
最近有這麼一個專案,這個專案需要依賴多個npm包,這些npm包有部分依賴是相同的(或者包與包之間有相互聯絡),如下:
圖1
如圖1所示,這裡有兩個npm包:npm1和npm2,它們有公共的依賴base2。這種情況下我們該如何管理原生代碼呢?
如果npm1和npm2原生代碼分別存入一個單獨的倉庫,那麼base2就需要copy一份,並且更新時兩側都要保持同步,另外如果還有更多的包,更多的公共依賴,那程式碼的維護就更加麻煩了!
為了解決這個問題,我們引入一個包管理工具——lerna。
使用介紹1、全域性安裝lerna
npm install lerna -g
安裝完成後,我們看一下控制檯有沒有這個命令:
圖2顯示版本為3.16.4,說明我們已經安裝成功了。
2、初始化我們的專案倉庫,先建立一個lerna-repo目錄,然後進入此目錄執行下面的命令
很明顯lerna.json是lerna的配置檔案(你會發現很多工具都有本地的配置檔案以便使用者可以根據自己的業務自定義能力),開啟這個json檔案,如下圖:
我們先關注這個packages屬性,它是一個數組,每個元素代表可以釋出的npm包的目錄,比如圖4中代表packages目錄(初始化生成的)下所有的資料夾都是可以發版的npm包,另外也可以自定義npm包的目錄,如下:
圖5中我們自定義了一個目錄——packages/plugins下所有的資料夾都是可以發版的npm包。
我們再看一眼圖3,一般lerna-repo目錄下可以存放各種依賴lib和入口entry,通過構建工具script tool將這些程式碼打包進packages目錄中
3、生成一個npm包
圖6中,我們在packages/plugins目錄下生成一個名為npm1的包,生成後的目錄結構如下:
4、為包新增依賴
lerna add 包名 [--scope=特定的某個包] [--dev]
功能類似於npm install 包名,scope指定為某個包新增依賴,如果沒有scope選項,就會為packages下所有的包新增這個依賴;dev選項代表依賴新增進devDependencies中。
5、檢視整個工程目錄下有哪些包
個人比較喜歡加一個-l先選項,資訊會更加全面一些。
6、為每個包安裝依賴
lerna bootstrap [--scope=特定的某個包]
功能和npm install差不多,如果不加scope,lerna會把工程下的所有包的依賴都安裝好!
lerna clean
8、匯入外部的包(這個命令比較有意思)
圖9中,koa是一個開源的包,我們用git下載到本地,然後用上面的命令匯入到packages/plugins目錄下,不僅程式碼會被匯入,連git的操作歷史也會被一起匯入,所以它的應用場景也就非常的明確,就是為了將已經存在的npm包程式碼庫遷移到 lerna 倉庫中。
9、執行包的script命令
lerna run 命令 [--scope=特定的某個包]
和npm run [命令] 沒什麼區別,如果沒有scope選項,lerna會執行每個包的script命令,如下:
圖10中運行了兩個包下的test命令。
10、檢視diff
lerna diff
和git diff 基本沒區別,會顯示工程下所有的修改
11、檢視可以釋出的包
圖11中顯示有兩個包可以釋出,當你釋出完成後再執行這個命令,紅色區域就會顯示No changed packages found。
12、釋出
如圖12所示,控制檯會讓使用者選擇要發版的版本號(最後一個可以自定義)
dist-tag選項可以發版一個其他分支的包,在測試時比較有用!
測試時可以釋出一個beta版(--dist-tag=beta),通過手動@版本號安裝(npm install 預設安裝latest)!
13、模式
lerna init初始化預設使用的是fixed模式,回看圖4中有個version選項,lerna在它的配置檔案中記錄了當前工程下所有包中最大的版本號,每個包發版時都是在這個版本號的基礎上增加,釋出完成,這個version也會更新到最大版本號!
比如 npm1 版本號是 0.0.1,npm2 版本號是 0.0.3,lerna配置檔案的version是0.0.3,你現在修改npm1,準備釋出新包,你認為新包的版本號可能是0.0.2?錯!此模式下,lerna會以配置檔案的version向上遞增:
如果增加patch,npm1發包後版本號是0.0.4,npm2的版本號不變;如果增加major或者minor,packages下的所有包都會統一增加,npm1和npm2都會統一變成0.1.0或者1.0.0;babel和vue就是採用這種模式的。
另一種模式是independent
lerna init --independent
這種模式下lerna就不會幫忙記錄版本號了,各包按照自己的規則遞增。
總結此篇文章主要介紹了lerna如何使用,有時看文件比較晦澀不容易懂,希望這篇文章能讓讀者更清楚的認識lerna!篇幅有限,還有很多的命令和配置沒有講到,在使用時如果有疑問可以在命令後面加一個--help選項,就會有使用介紹!