lerna的嘗試

概要

lerna是GitHub上面開源的一款js代碼庫管理軟件, 用來對一系列相互耦合比較大、又相互獨立的js git庫進(jìn)行管理。解決各個庫之間修改混亂、難以跟蹤的問題。
Lerna 是一個工具,它優(yōu)化了使用 git 和 npm 管理多包存儲庫的工作流。對于一些功能比較全的庫,我們往往會把各個小功能拆分成獨立的npm庫,他們直接有比較強(qiáng)的依賴關(guān)系。比如:Babel、React等開源代碼都是按照這種方式進(jìn)行處理的。

  • 假設(shè)主項目是 vuejs,依賴兩個自研 npm 包,這兩個包也依賴 vuejs,現(xiàn)在主項目要升級 vue 版本,那么這兩個 npm 包也得跟著升級,且需要升級兩次(一個包一次),提升效率是否只發(fā)一次呢。
  • 假設(shè)有兩個 npm 包A和B,A依賴B,那么每當(dāng)B有更新時,要想讓A用上B的更新,需要B發(fā)版,然后A升級B的依賴,可否能同時發(fā)布升級節(jié)省效率

優(yōu)勢

  • lerna,一種多包依賴解決方案,簡單來講:
    1.可以管理公共依賴和單獨依賴;
    2.多package相互依賴直接內(nèi)部 link,不必發(fā)版;
    3.可以單獨發(fā)布和全體發(fā)布;
    4.將一個大的 package 分割成一些小的 packcage 便于分享,調(diào)試;多包放一個git倉庫,也有利于代碼管理,如配置統(tǒng)一的代碼規(guī)范
    5.類似框架還有Yarn workspace;

兩種工作模式

Fixed/Locked mode (default)
vue,babel 都是用這種,在 publish 的時候,所有的包版本都會更新,并且包的版本都是一致的,版本號維護(hù)在 lerna.jon 的 version 中;

Independent mode
lerna init --independent

獨立模式,每個 package 都可以有自己的版本號。版本號維護(hù)在各自 package.json 的 version 中。每次發(fā)布前都會提示已經(jīng)更改的包,以及建議的版本號或者自定義版本號。這種方式相對第一種來說,更靈活。

全局安裝并init

yarn global add lerna
or 
npm install -g lerna
lerna init --independent
初始化項目時使用 Independent 模式
Independent 模式可以單獨發(fā)版,更靈活

成功后,生成目錄:

- packages(目錄)
- lerna.json(配置文件)
- package.json(工程描述文件)

添加子package

cd packages && mkdir moduleA && cd moduleA && touch index.js && npm init
假如touch創(chuàng)建文件報錯
npm install touch-cli -g 解決
--access 當(dāng)使用scope package時(@qinzhiwei/lerna),需要設(shè)置此選項 [可選值: “public”, “restricted”][默認(rèn)值: public]

--bin 創(chuàng)建可執(zhí)行文件 --bin <executableName>

--description 描述 [字符串]

--dependencies 依賴,用逗號分隔 [數(shù)組]

--es-module 初始化一個轉(zhuǎn)化的Es Module [布爾]

--homepage 源碼地址 [字符串]

--keywords 關(guān)鍵字?jǐn)?shù) [數(shù)組]

--license 協(xié)議 [字符串][默認(rèn)值: isc]

--private 是否私有倉庫 [布爾]

--registry 源 [字符串]

--tag 發(fā)布的標(biāo)簽 [字符串]

-y, --yes 跳過所有的提示,使用默認(rèn)配置 [布爾]

擴(kuò)展:

ISC許可

  • ISC許可證是一種開放源代碼許可證,在功能上與兩句版的BSD許可證相同。
  • 這份許可證是由ISC(Internet Systems Consortium)所發(fā)明,在ISC釋出軟件時所使用的。
  • 當(dāng)前版本 ISC License (ISC)

MIT許可

  • MIT許可證之名源自麻省理工學(xué)院(Massachusetts Institute of Technology, MIT),又稱“X條款”(X License)或“X11條款”(X11 License)。
  • MIT是和BSD一樣寬范的許可協(xié)議,作者只想保留版權(quán),而無任何其他了限制。也就是說,你必須在你的發(fā)行版里包含原許可協(xié)議的聲明,無論你是以二進(jìn)制發(fā)布的還是以源代碼發(fā)布的。
  • 當(dāng)前版本 The MIT License

常用命令

lerna create

lerna create <name> [loc]
創(chuàng)建一個包,name包名,loc 位置可選,例如:

# 根目錄的package.json 
 "workspaces": [
    "packages/*",
    "packages/@utils/*"
  ],
  
# 創(chuàng)建一個包gpnote默認(rèn)放在 workspaces[0]所指位置
lerna create dateUtils

# 創(chuàng)建一個包gpnote指定放在 packages/@utils文件夾下,注意必須在workspaces先寫入packages/@utils,看上面
lerna create dateUtils packages/@utils
命名通常用例如@gds/plugin-XXXX

bootstrap

使用bootstrap命令,會下載所有定義在package.json中的依賴包。相當(dāng)于執(zhí)行npm install,并且鏈接所有依賴包。

publish(重點)

當(dāng)你完成某個包的更新后,就可以使用lerna publish命令來發(fā)布新版本的包。執(zhí)行這條命令的時候,你可以指定版本號,然后lerna就會自動給你加更新版本號,加tag并提交到git倉庫上去。(ps:過程中遇到很坑的問題,本地代碼push遠(yuǎn)程后,執(zhí)行publish指令,會基于當(dāng)前l(fā)erna.json中的版本號讓你選默認(rèn)升級版本號,然后會覆蓋本地文件版本號,報錯:

lerna ERR! EUNCOMMIT Working tree has uncommitted changes,
please commit or remove the following changes before continuing:


(坑爹啊有木有)明明是你的機(jī)制改動了我本地文件,又說我本地有殘留文件;最后查了很多資料,最好方式是以下第三種上傳方式來解決。

官方文檔中,lerna publish 一共有這樣幾種執(zhí)行表現(xiàn)形式:

1.lerna publish 永遠(yuǎn)不會發(fā)布 package.json 中 private 設(shè)置為 true 的包

發(fā)布自上次發(fā)布來有更新的包(這里的上次發(fā)布也是基于上次執(zhí)行l(wèi)erna publish 而言)

2.發(fā)布在當(dāng)前 commit 上打上了 annotated tag 的包(即 lerna publish from-git)

3.(重要重要重要)發(fā)布在最近 commit 中修改了 package.json 中的 version (且該 version 在 registry 中沒有發(fā)布過)的包(即 lerna publish from-package)

發(fā)布在上一次提交中更新了的 unversioned 的測試版本的包(以及依賴了的包)

lerna publish 本身提供了不少的 options,例如支持發(fā)布測試版本的包即 (lerna version --canary)。

add

假設(shè)你想往你的開發(fā)項目中特定包中加入依賴,你就可以使用add命令輕松實現(xiàn):

# 給a, b 包中加入Lodash,會同時改變a,b模塊中packages.json文件
lerna add lodash packages/a packages/b 
# 給a 包中加入jquery, 使用--dev參數(shù)是使依賴加入到devDependencies中
lerna add jquery packages/a --dev
# 你也可以使用通配符, 下面這命令,會往所有re開頭的模塊包中加入依賴
lerna add jquery packages/re-* 
# 指定特定的范圍,要使用--scope參數(shù),如下:給b包安裝a模塊
lerna add a --scope=b

clean

執(zhí)行clean命令,用來刪除所有模塊下node_modules中的npm包。

import

你可以使用import命令導(dǎo)入已有的模塊,并且會保留所有的git commit記錄。

list

列出項目中所有的模塊。

run

在每個包含該腳本的模塊中運行npm腳本。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容