背景
最近有這么一個項目,這個項目需要依賴多個npm包,這些npm包有部分依賴是相同的(或者包與包之間有相互聯系),如下:

如圖1所示,這里有兩個npm包:npm1和npm2,它們有公共的依賴base2。這種情況下我們該如何管理本地代碼呢? 如果npm1和npm2本地代碼分別存入一個單獨的倉庫,那么base2就需要copy一份,並且更新時兩側都要保持同步,另外如果還有更多的包,更多的公共依賴,那代碼的維護就更加麻煩了! 為了解決這個問題,我們引入一個包管理工具——lerna。

圖2顯示版本為3.16.4,說明我們已經安裝成功了。 2、初始化我們的項目倉庫,先創建一個lerna-repo目錄,然后進入此目錄運行下面的命令 lerna init //先采用默認模式,生成圖3目錄結構

很明顯lerna.json是lerna的配置文件(你會發現很多工具都有本地的配置文件以便用戶可以根據自己的業務自定義能力),打開這個json文件,如下圖:

我們先關注這個packages屬性,它是一個數組,每個元素代表可以發布的npm包的目錄,比如圖4中代表packages目錄(初始化生成的)下所有的文件夾都是可以發版的npm包,另外也可以自定義npm包的目錄,如下:

圖5中我們自定義了一個目錄——packages/plugins下所有的文件夾都是可以發版的npm包。 我們再看一眼圖3,一般lerna-repo目錄下可以存放各種依賴lib和入口entry,通過構建工具script tool將這些代碼打包進packages目錄中
3、生成一個npm包 lerna create <包名> [目錄]

圖6中,我們在packages/plugins目錄下生成一個名為npm1的包,生成后的目錄結構如下:

如果是放在默認packages里面的話,不需要輸入目錄
注意需要在git環境下進行添加否則會出現報錯
lerna ERR! ENOGIT The git binary was not found, or this is not a git repository.
4、為包添加依賴 lerna add 包名 [--scope=特定的某個包] [--dev] 功能類似於npm install 包名,scope指定為某個包添加依賴,如果沒有scope選項,就會為packages下所有的包添加這個依賴;dev選項代表依賴添加進devDependencies中。 5、查看整個工程目錄下有哪些包 lerna list [-l]

個人比較喜歡加一個-l先選項,信息會更加全面一些。
6、為每個包安裝依賴 lerna bootstrap [--scope=特定的某個包] 功能和npm install差不多,如果不加scope,lerna會把工程下的所有包的依賴都安裝好!
7、刪除包下面的node_modules 上面的命令安裝依賴會在每個包目錄下生成node_modules,下面的命令就是將node_modules刪除 lerna clean
8、導入外部的包(這個命令比較有意思) lerna import 外部包的位置 --dest=工程下的位置

圖9中,koa是一個開源的包,我們用git下載到本地,然后用上面的命令導入到packages/plugins目錄下,不僅代碼會被導入,連git的操作歷史也會被一起導入,所以它的應用場景也就非常的明確,就是為了將已經存在的npm包代碼庫遷移到 lerna 倉庫中。