lerna的嘗試

概要

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腳本愈腾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末憋活,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虱黄,更是在濱河造成了極大的恐慌悦即,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辜梳,居然都是意外死亡粱甫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門作瞄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茶宵,“玉大人,你說我怎么就攤上這事宗挥∥谑” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵属韧,是天一觀的道長安拟。 經(jīng)常有香客問我蛤吓,道長宵喂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任会傲,我火速辦了婚禮锅棕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淌山。我一直安慰自己裸燎,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布泼疑。 她就那樣靜靜地躺著德绿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪退渗。 梳的紋絲不亂的頭發(fā)上移稳,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音会油,去河邊找鬼个粱。 笑死,一個胖子當著我的面吹牛翻翩,可吹牛的內(nèi)容都是我干的都许。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫂冻,長吁一口氣:“原來是場噩夢啊……” “哼胶征!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桨仿,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤弧烤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暇昂,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡莺戒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了急波。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片从铲。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖澄暮,靈堂內(nèi)的尸體忽然破棺而出名段,到底是詐尸還是另有隱情,我是刑警寧澤泣懊,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布伸辟,位于F島的核電站,受9級特大地震影響馍刮,放射性物質(zhì)發(fā)生泄漏信夫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一卡啰、第九天 我趴在偏房一處隱蔽的房頂上張望静稻。 院中可真熱鬧,春花似錦匈辱、人聲如沸振湾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽押搪。三九已至,卻和暖如春浅碾,著一層夾襖步出監(jiān)牢的瞬間大州,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工及穗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摧茴,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓埂陆,卻偏偏與公主長得像苛白,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子焚虱,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容