概要
lerna是GitHub上面開源的一款js代碼庫管理軟件冒萄, 用來對一系列相互耦合比較大池摧、又相互獨立的js git庫進行管理。解決各個庫之間修改混亂红伦、難以跟蹤的問題英古。
Lerna 是一個工具,它優(yōu)化了使用 git 和 npm 管理多包存儲庫的工作流昙读。對于一些功能比較全的庫召调,我們往往會把各個小功能拆分成獨立的npm庫,他們直接有比較強的依賴關(guān)系蛮浑。比如:Babel唠叛、React等開源代碼都是按照這種方式進行處理的。
- 假設(shè)主項目是 vuejs沮稚,依賴兩個自研 npm 包艺沼,這兩個包也依賴 vuejs,現(xiàn)在主項目要升級 vue 版本蕴掏,那么這兩個 npm 包也得跟著升級障般,且需要升級兩次(一個包一次),提升效率是否只發(fā)一次呢盛杰。
- 假設(shè)有兩個 npm 包A和B挽荡,A依賴B,那么每當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 的時候,所有的包版本都會更新,并且包的版本都是一致的车份,版本號維護在 lerna.jon 的 version 中;
Independent mode
lerna init --independent
獨立模式谋减,每個 package 都可以有自己的版本號。版本號維護在各自 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 當使用scope package時(@qinzhiwei/lerna)梢为,需要設(shè)置此選項 [可選值: “public”, “restricted”][默認值: public]
--bin 創(chuàng)建可執(zhí)行文件 --bin <executableName>
--description 描述 [字符串]
--dependencies 依賴,用逗號分隔 [數(shù)組]
--es-module 初始化一個轉(zhuǎn)化的Es Module [布爾]
--homepage 源碼地址 [字符串]
--keywords 關(guān)鍵字數(shù) [數(shù)組]
--license 協(xié)議 [字符串][默認值: isc]
--private 是否私有倉庫 [布爾]
--registry 源 [字符串]
--tag 發(fā)布的標簽 [字符串]
-y, --yes 跳過所有的提示轰坊,使用默認配置 [布爾]
擴展:
ISC許可
- ISC許可證是一種開放源代碼許可證铸董,在功能上與兩句版的BSD許可證相同。
- 這份許可證是由ISC(Internet Systems Consortium)所發(fā)明肴沫,在ISC釋出軟件時所使用的粟害。
- 當前版本 ISC License (ISC)
MIT許可
- MIT許可證之名源自麻省理工學院(Massachusetts Institute of Technology, MIT),又稱“X條款”(X License)或“X11條款”(X11 License)颤芬。
- MIT是和BSD一樣寬范的許可協(xié)議我磁,作者只想保留版權(quán),而無任何其他了限制。也就是說驻襟,你必須在你的發(fā)行版里包含原許可協(xié)議的聲明夺艰,無論你是以二進制發(fā)布的還是以源代碼發(fā)布的。
- 當前版本 The MIT License
常用命令
lerna create
lerna create <name> [loc]
創(chuàng)建一個包沉衣,name包名郁副,loc 位置可選,例如:
# 根目錄的package.json
"workspaces": [
"packages/*",
"packages/@utils/*"
],
# 創(chuàng)建一個包gpnote默認放在 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中的依賴包。相當于執(zhí)行npm install
既荚,并且鏈接所有依賴包稚失。
publish(重點)
當你完成某個包的更新后,就可以使用lerna publish
命令來發(fā)布新版本的包恰聘。執(zhí)行這條命令的時候句各,你可以指定版本號,然后lerna就會自動給你加更新版本號晴叨,加tag并提交到git倉庫上去凿宾。(ps:過程中遇到很坑的問題,本地代碼push遠程后兼蕊,執(zhí)行publish指令初厚,會基于當前l(fā)erna.json中的版本號讓你選默認升級版本號,然后會覆蓋本地文件版本號孙技,報錯:
lerna ERR! EUNCOMMIT Working tree has uncommitted changes,
please commit or remove the following changes before continuing:
)
(坑爹啊有木有)明明是你的機制改動了我本地文件产禾,又說我本地有殘留文件;最后查了很多資料牵啦,最好方式是以下第三種上傳方式來解決下愈。
官方文檔中,lerna publish 一共有這樣幾種執(zhí)行表現(xiàn)形式:
1.lerna publish 永遠不會發(fā)布 package.json 中 private 設(shè)置為 true 的包
發(fā)布自上次發(fā)布來有更新的包(這里的上次發(fā)布也是基于上次執(zhí)行l(wèi)erna publish 而言)
2.發(fā)布在當前 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腳本愈腾。