像babel那樣使用lerna管理你的項目

舒適提示:請直接看最後面的正確操做,若是不懂,再回顧全文。

如何像 babel 那樣進行多包管理呢?

babel 項目的 packages 裏面存放了 babel 旗下的全部包,好比:babel-core。git

咱們在安裝 babel 的時候通常不是這樣裝的:yarn add babel,而是這樣安裝的:yarn add @babel/babel-core,這是因爲 babel 進行了分包管理的緣故,又由於 npm 支持scope packages,因此咱們能夠這樣子來安裝包。github

咱們再來看scope packages,npm 支持以@符開頭的包名稱,把它叫作有範圍的包,示例:@somescope/somepackagenpm

可是在發佈包的時候,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來管理了。

相關文章
相關標籤/搜索