Lerna -- 管理包含多個(gè)包javascript項(xiàng)目的工具
將一個(gè)大的代碼庫(kù)分離成不同的獨(dú)立版本控制的包可以極大的促進(jìn)代碼的共用,然而,在不同的庫(kù)作出改動(dòng)是容易混亂并且不容易追蹤,同時(shí)在不同的庫(kù)之間測(cè)試復(fù)雜度會(huì)很快增加。
為了解決以上問(wèn)題(也包括其他的問(wèn)題),一些項(xiàng)目將代碼庫(kù)組織成多包庫(kù)。在一個(gè)庫(kù)中開(kāi)發(fā)所有的包.
** Lerna 是一個(gè)使用git和npm來(lái)優(yōu)化管理多包倉(cāng)庫(kù)的流程的工具 **
lerna 倉(cāng)庫(kù)的樣子
my-lerna-repo/
package.json
packages/
package-1/
package.json
package-2/
package.json
lerna 能做什么
在lerna中兩個(gè)初始命令 lerna bootstrap 和 lerna publish。
bootstrap 鏈接在倉(cāng)庫(kù)中的依賴(lài)。 publish命令可以幫助發(fā)布和更新包
lerna 不能做什么
lerna 無(wú)服務(wù)器單一庫(kù)的部署工具,以來(lái)提升會(huì)和傳統(tǒng)的無(wú)服務(wù)器單一庫(kù)部署技術(shù)不相容。
開(kāi)始使用
lerna項(xiàng)目初始化,執(zhí)行l(wèi)erna init命令
$ mkdir lerna-repo && cd $_
$ npx lerna init
這將會(huì)創(chuàng)建一個(gè) lerna.json同時(shí)也添加一個(gè)packages文件夾,文件夾的目錄是:
lerna-repo/
packages/
package.json
lerna.jsonk
如何工作
lerna 允許你使用兩個(gè)模式中的一個(gè)來(lái)管理你的項(xiàng)目,固定和獨(dú)立模式
固定模式(鎖定模式) 默認(rèn)
固定模式的lerna項(xiàng)目將操作一個(gè)版本線(xiàn), 該版本值在根目錄下的 lerna.json文件中的一個(gè)version字段中維護(hù)。當(dāng)你運(yùn)行 lerna pulish 時(shí),如果一個(gè)在lerna中且被依賴(lài)模塊從上次發(fā)布的版本之后更新過(guò),它將會(huì)在你新發(fā)布的版本中更新。這意味著,你只需要發(fā)布一個(gè)新的版本包當(dāng)你需要的時(shí)候。
注意: 如果要發(fā)布一個(gè)未使用的朱版本號(hào),所有的包都會(huì)被認(rèn)為是更新。
這種模式也是Babel正在使用的。
獨(dú)立模式
獨(dú)立模式的lerna項(xiàng)目允許維護(hù)者獨(dú)立給的對(duì)每個(gè)包的版本管理。每次發(fā)布的時(shí)候,將會(huì)提示改變每個(gè)包的主要 次要和分支版本號(hào)。
在lerna.json文件中將version字段改為independent來(lái)運(yùn)行獨(dú)立依賴(lài)模式。
概念
運(yùn)行 lerna --help 命令查看可用的命令行和配置項(xiàng)
lerna.json
{
"version": "1.1.3",
"npmClient": "npm",
"command": {
"publish": {
"ignoreChanges": ["ignored-file", "*.md"],
"message": "chore(release): publish",
"registry": "https://npm.pkg.github.com"
},
"bootstrap": {
"ignore": "component-*",
"npmClientArgs": ["--no-package-lock"]
}
},
"packages": ["packages/*"]
}
- version: 當(dāng)前倉(cāng)庫(kù)版本
- npmClient: 使用npm還是yarn來(lái)管理運(yùn)行客戶(hù)端命令
- command.publish.ignoreChanges: 發(fā)布忽略
- command.publish.message 發(fā)布的信息
- command.publish.registry 倉(cāng)庫(kù)地址
- command.bootstrap.ignore bootstrap忽略
- command.bootstrap.npmClientArgs 在bootstrap 中執(zhí)行npm install傳入的參數(shù)
- command.bootstrap.scope 指定bootstrap 的文件目錄
- packages: 指定包的位置
在lerna.json中的包是那些包含package.json的文件夾,這是lerna如何識(shí)別葉子“包”,卻別與根package.json,用來(lái)管理整個(gè)倉(cāng)庫(kù)開(kāi)發(fā)依賴(lài)和腳本命令
結(jié)合glob的路徑配置來(lái)指定包目錄,【packages/*,modules/*】
公共開(kāi)發(fā)依賴(lài) devDependencies
大部分 devDependenced 可以被拉取到跟lerna倉(cāng)庫(kù),使用lerna link convert命令
上述命令將自動(dòng)提升依賴(lài),使用file:來(lái)替代
依賴(lài)提升有一些優(yōu)點(diǎn):
- 所有的包使用給你版本的依賴(lài)
- 可以維護(hù)依賴(lài)在根目錄下,
- 減少依賴(lài)安裝時(shí)間
- 更少的存儲(chǔ)空間
注意: 那些提供二級(jí)制執(zhí)行碼的包仍需要在每個(gè)包安裝