如何像 babel 那樣進行多包管理呢?
babel 項目的 packages 裏面存放了 babel 旗下的所有包,比如:babel-core。
我們在安裝 babel 的時候一般不是這樣裝的:yarn add babel
,而是這樣安裝的:yarn add @babel/babel-core
,這是由於 babel 進行了分包管理的緣故,又因爲 npm 支持scope packages
,所以我們可以這樣子來安裝包。
我們再來看scope packages
,npm 支持以@符開頭的包名稱,把它叫做有範圍的包,示例:@somescope/somepackage
。
但是在發佈包的時候,npm 會把這種包當成是你的私有包來進行發佈,一般我們是發佈不了的,因爲 npm 會提示需要登錄等等東西,這個時候我們一般就加上一個參數,告訴 npm 我們要發佈的這個包是一個公共包:npm publish --access=public
,不出意外這個包就可以發佈成功了。
別人要安裝你的包:yarn add @somescope/somepackage
,看起來跟安裝 babel-core 一致了。
但是還差點東西,就是利用 lerna 來進行管理。
要達到類似於 babel 那樣的管理方式,首先,你需要有scope packages
,正好,我們現在有了一個@somescope/somepackage
包,現在我們就用 lerna 來管理它。
首先,我們在 github 上面新建一個倉庫,就叫做:testlerna 吧(使用已有倉庫也行),然後克隆到本地,進入到 testlerna 目錄,執行:lerna init
或者是lerna init -i
(表示 packages 下面的包單獨使用版本號),這個時候,lerna 就爲我們生成了這幾個東西:
testlerna
|-package.json
|-lerna.json
|-packages/
packages 目錄就是 lerna 要進行管理的各種包的目錄,所有的包都會放在這個目錄下面。
接着執行:lerna import ../scopepackage
(假設咱們的這個@somescope/somepackage
包是放在 scopepackage 目錄裏面的),這樣就會把我們剛纔發佈的那個包導入到 packages 目錄裏面,這時候目錄看起來像這個樣子:
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 來管理你的包,簡單多了。
可以訪問:https://github.com/kybetter/t... 看到這個測試項目
這兩個是測試時發佈的包:
https://www.npmjs.com/package...
https://www.npmjs.com/package...
如果這篇文章給你帶來幫助,可以給我點個贊。