babel 項目的 packages 裏面存放了 babel 旗下的全部包,好比:babel-core。git
咱們在安裝 babel 的時候通常不是這樣裝的:yarn add babel
,而是這樣安裝的:yarn add @babel/babel-core
,這是因爲 babel 進行了分包管理的緣故,又由於 npm 支持scope packages
,因此咱們能夠這樣子來安裝包。github
咱們再來看scope packages
,npm 支持以@符開頭的包名稱,把它叫作有範圍的包,示例:@somescope/somepackage
。npm
可是在發佈包的時候,npm 會把這種包當成是你的私有包來進行發佈,通常咱們是發佈不了的,由於 npm 會提示須要登陸等等東西,這個時候咱們通常就加上一個參數,告訴 npm 咱們要發佈的這個包是一個公共包:npm publish --access=public
,不出意外這個包就能夠發佈成功了。json
別人要安裝你的包:yarn add @somescope/somepackage
,看起來跟安裝 babel-core 一致了。babel
可是還差點東西,就是利用 lerna 來進行管理。學習
要達到相似於 babel 那樣的管理方式,首先,你須要有scope packages
,正好,咱們如今有了一個@somescope/somepackage
包,如今咱們就用 lerna 來管理它。code
首先,咱們在 github 上面新建一個倉庫,就叫作:testlerna 吧(使用已有倉庫也行),而後克隆到本地,進入到 testlerna 目錄,執行:lerna init
或者是lerna init -i
(表示 packages 下面的包單獨使用版本號),這個時候,lerna 就爲咱們生成了這幾個東西:it
testlerna |-package.json |-lerna.json |-packages/
packages 目錄就是 lerna 要進行管理的各類包的目錄,全部的包都會放在這個目錄下面。test
接着執行:lerna import ../scopepackage
(假設我們的這個@somescope/somepackage
包是放在 scopepackage 目錄裏面的),這樣就會把咱們剛纔發佈的那個包導入到 packages 目錄裏面,這時候目錄看起來像這個樣子:import
testlerna |-package.json |-lerna.json |-packages/ |--scopepackage/ |---package.json |---...
作一些修修改改並執行 git commit 後,咱們就能夠執行lerna publish
了,不出意外你的@somescope/somepackage
也在 npm 上更新了,原來的那個@somescope/somepackage
倉庫能夠刪除掉了,由於咱們把它放在 testlerna 項目中進行管理了,這樣就跟 babel 那樣的管理方式同樣了。
這種方式是有一丟丟麻煩,由於 npm 默認會把 @ 開頭的包當成私有包來看待,就致使了若是不在 npm 上提交一次公共版本,執行lerna publish
時就會發布不了,可能lerna publish
調用的 npm 命令是npm publish
它沒有加--access=publish
參數。
若是你不想這麼麻煩,那麼有一個辦法就是,不用scope package
,也就是你的包名不加 @ 前綴,這樣你的包就默認是公共的包了,徹底能夠不用先去提交一次公共版本,才能使用 lerna 來管理你的包,簡單多了。
更新,不用像上面那麼麻煩了,還得新建一個倉庫,你大能夠把前面那種方法當成是學習 npm 的 scope package 吧。
正確的方式是這種:
使用 lerna init 後,packages 裏面也有你的包了,這時候咱們要先進行第一次發佈,直接進入 packages/你的包目錄,執行:npm publish --access=public
,
發佈完之後,下次你就能夠在主項目裏面使用:lerna publish
來管理了。