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

如何像 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...

如果這篇文章給你帶來幫助,可以給我點個贊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章