lerna的基礎(chǔ)使用

lerna

概要

lerna是GitHub上面開源的一款js代碼庫管理軟件, 用來對(duì)一系列相互耦合比較大、又相互獨(dú)立的js git庫進(jìn)行管理揖闸。解決各個(gè)庫之間修改混亂揍堕、難以跟蹤的問題。lerna可以優(yōu)化這種情形下的工作流汤纸。

對(duì)于一些功能比較全的庫衩茸,我們往往會(huì)把各個(gè)小功能拆分成獨(dú)立的npm庫,他們直接有比較強(qiáng)的依賴關(guān)系贮泞。比如:Babel楞慈、React等開源代碼都是按照這種方式進(jìn)行處理的。

代碼庫結(jié)構(gòu)

lerna管理的庫文件結(jié)構(gòu)類似如下這樣

my-lerna-repo/
  package.json
  packages/
    package-1/
      package.json
    package-2/
      package.json

lerna主要做了什么

  • 通過lerna的命令lerna bootstrap 將會(huì)把代碼庫進(jìn)行l(wèi)ink啃擦。
  • 通過lerna publish發(fā)布最新改動(dòng)的庫

Get Started

下面使用3.x版本的lerna進(jìn)行測(cè)試囊蓝, 官方也建議使用3.x代替2.x

首先,初始化lerna庫

cd lerna-repo
lerna init

默認(rèn)會(huì)創(chuàng)建lerna.json和packages目錄, 如下

lerna-repo/
  packages/
  package.json
  lerna.json

lerna如何工作的

默認(rèn)lerna有兩種管理模式令蛉, 固定模式和獨(dú)立模式

固定模式

固定模式聚霜,通過lerna.json的版本進(jìn)行版本管理。當(dāng)你執(zhí)行lerna publish命令時(shí)珠叔, 如果距離上次發(fā)布只修改了一個(gè)模塊蝎宇,將會(huì)更新對(duì)應(yīng)模塊的版本到新的版本號(hào),然后你可以只發(fā)布修改的庫祷安。

這種模式也是Babel使用的方式姥芥。如果你希望所有的版本一起變更, 可以更新minor版本號(hào)辆憔,這樣會(huì)導(dǎo)致所有的模塊都更新版本撇眯。

獨(dú)立模式

獨(dú)立模式,init的時(shí)候需要設(shè)置選項(xiàng) --independent. 獨(dú)立模式允許管理者對(duì)每個(gè)庫單獨(dú)改變版本號(hào)虱咧,每次發(fā)布的時(shí)候熊榛,你需要為每個(gè)改動(dòng)的庫指定版本號(hào)。這種情況下腕巡, lerna.json的版本號(hào)不會(huì)變化了玄坦, 默認(rèn)為independent

lerna.json解析

{
  "version": "1.1.3",
  "npmClient": "npm",
  "command": {
    "publish": {
      "ignoreChanges": [
        "ignored-file",
        "*.md"
      ]
    },
    "bootstrap": {
      "ignore": "component-*",
      "npmClientArgs": ["--no-package-lock"]      
    }
  },
  "packages": ["packages/*"]
}
  • version , 當(dāng)前庫的版本
  • npmClient , 允許指定命令使用的client绘沉, 默認(rèn)是 npm煎楣, 可以設(shè)置成 yarn
  • command.publish.ignoreChanges , 可以指定那些目錄或者文件的變更不會(huì)被publish
  • command.bootstrap.ignore 车伞, 指定不受 bootstrap 命令影響的包
  • command.bootstrap.npmClientArgs 择懂, 指定默認(rèn)傳給 lerna bootstrap 命令的參數(shù)
  • command.bootstrap.scope , 指定那些包會(huì)受 lerna bootstrap 命令影響
  • packages 另玖, 指定包所在的目錄

命令行

lerna publish

發(fā)布新的庫版本

lerna publish  // 發(fā)布最新commit的修改
lerna publish <commit-id> // 發(fā)布指定commit-id的代碼

Options

canary

可以用來獨(dú)立發(fā)布每個(gè)commit困曙,不打tag

lerna publish --canary
# 1.0.0 => 1.0.1-alpha.0+${SHA} of packages changed since the previous commit
# a subsequent canary publish will yield 1.0.1-alpha.1+${SHA}, etc

lerna publish --canary --preid beta
# 1.0.0 => 1.0.1-beta.0+${SHA}

# The following are equivalent:
lerna publish --canary minor
lerna publish --canary preminor
# 1.0.0 => 1.1.0-alpha.0+${SHA}

--npm-client

默認(rèn)npm

--npm-tag

為發(fā)布的版本添加 dist-tag

--no-verify-access

不進(jìn)行用戶發(fā)布的權(quán)限校驗(yàn)

--registry <url>

指定registry

--yes

用于ci自動(dòng)輸入 yes

--temp-tag

沒啥用

lerna version

這個(gè)命令 識(shí)別出修改的包 --> 創(chuàng)建新的版本號(hào) --> 修改package.json --> 提交修改 打上版本的tag --> 推送到git上表伦。

版本號(hào) 遵循 semver

Options

--allow-branch <glob>

設(shè)置git上的哪些分支允許執(zhí)行 lerna version 命令, 也可以在lerna.json中設(shè)置

{
  "command": {
    "publish": {
      "allowBranch": "master"
    }
  }
}

多個(gè)
{
  "command": {
    "publish": {
      "allowBranch": ["master", "feature/*"]
    }
  }
}

--amend

把version的修改都合并到前一個(gè)commit慷丽, 而且不會(huì)推送哦蹦哼。

--commit-hooks

執(zhí)行對(duì)應(yīng)的commit-hook, 默認(rèn)true

--conventional-commits

使用了這個(gè)選項(xiàng)要糊, lerna會(huì)收集日志纲熏, 自動(dòng)生成 CHANGELOG

--changelog-preset

修改changelog生成插件, 默認(rèn)是 angular

--exact

??? 沒試出什么效果

--force-publish

強(qiáng)制更改所有包的版本锄俄, 不管有沒有修改

--ignore-changes

忽略檢查某些文件的修改

lerna version --ignore-changes '**/*.md' '**/__tests__/**'

也可以在lerna.json中配置

{
  "ignoreChanges": [
    "**/__fixtures__/**",
    "**/__tests__/**",
    "**/*.md"
  ]
}

--git-remote <name>

把修改推送到其它的源局劲, 而不是origin

--git-tag-version

添加git的tag, 默認(rèn)true

--message <msg>

指定提交信息奶赠, 而不是自動(dòng)生成的log

也可以在lerna.json配置

{
  "command": {
    "publish": {
      "message": "chore(release): publish %s"
    }
  }
}

lerna bootstrap

bootstrap作了如下工作

  • 為每個(gè)包安裝依賴
  • 鏈接相互依賴的庫到具體的目錄
  • 執(zhí)行 npm run prepublish
  • 執(zhí)行 npm run prepare

可以通過 -- 后添加選項(xiàng), 設(shè)置npm cient的參數(shù)

lerna bootstrap -- --production --no-optional

也可以在lerna.json中配置

{
  ...
  "npmClient": "yarn",
  "npmClientArgs": ["--production", "--no-optional"]
}

Options

--hoist

這個(gè)選項(xiàng)容握,會(huì)把共同依賴的庫安裝到根目錄的node_modules下, 統(tǒng)一版本

--ignore

忽略部分目錄车柠, 不進(jìn)行安裝依賴

lerna bootstrap --ignore component-*

也可以在lerna.json中配置

{
  "version": "0.0.0",
  "command": {
    "bootstrap": {
      "ignore": "component-*"
    }
  }
}

--ignore-scripts

不執(zhí)行聲明周期腳本命令, 比如 prepare

--registry <url>

指定registry

--npm-client

指定安裝用的npm client

lerna bootstrap --npm-client=yarn

也可以在lerna.json中配置

{
  ...
  "npmClient": "yarn"
}

--use-workspace

使用yarn workspace塑猖, 沒用過

--no-ci

默認(rèn)調(diào)用 npm ci 替換 npm install , 使用選項(xiàng)修改設(shè)置

lerna list

列舉當(dāng)前l(fā)erna 庫包含的包

Options

--json

顯示信息為json格式

--all

顯示包含private的包

--parseable

顯示如下格式 <fullpath>:<name>:<version>[:flags..]

--long

顯示更多的擴(kuò)展信息

lerna changed

顯示自上次relase tag以來有修改的包竹祷, 選項(xiàng)通 list

lerna diff

顯示自上次relase tag以來有修改的包的差異, 執(zhí)行 git diff

lerna exec

在每個(gè)包目錄下執(zhí)行任意命令

使用示例

$ lerna exec -- <command> [..args] # runs the command in all packages
$ lerna exec -- rm -rf ./node_modules
$ lerna exec -- protractor conf.js
$ lerna exec -- npm view \$LERNA_PACKAGE_NAME
$ lerna exec -- node \$LERNA_ROOT_PATH/scripts/some-script.js

Options

--concurrency

默認(rèn)命令時(shí)并行執(zhí)行的羊苟, 我們可以設(shè)置并發(fā)量為1

lerna exec --concurrency 1 -- ls -la

--scope

lerna exec --scope my-component -- ls -la

--stream

交叉并行輸出結(jié)果

lerna exec --stream -- babel src -d lib

--parallel

--no-bail

默認(rèn)lerna exec塑陵,如果有命令返回了非0, 則會(huì)停止執(zhí)行蜡励, 通過設(shè)置這個(gè)參數(shù) 忽略返回非0令花, 繼續(xù)執(zhí)行其它命令

lerna run

執(zhí)行每個(gè)包package.json中的腳本命令

$ lerna run <script> -- [..args] # runs npm run my-script in all packages that have it
$ lerna run test
$ lerna run build

# watch all packages and transpile on change, streaming prefixed output
$ lerna run --parallel watch

選項(xiàng)通 lerna exec

lerna init

創(chuàng)建一個(gè)新的lerna庫或者是更新lerna版本

  • 修改package.json中l(wèi)erna版本
  • 創(chuàng)建lerna.json

Options

--independent

獨(dú)立模式

--exeact

版本號(hào)固定?

lerna add

添加一個(gè)包的版本為各個(gè)包的依賴

$ lerna add <package>[@version] [--dev] [--exact]

lerna clean

刪除各個(gè)包下的node_modules

lerna import

導(dǎo)入指定git倉庫的包作為lerna管理的包

lerna import <path-to-external-repository>

Options

--flatten

如果有merge沖突凉倚, 用戶可以使用這個(gè)選項(xiàng)所謂單獨(dú)的commit

$ lerna import ~/Product --flatten

--dest

可以指定導(dǎo)入的目錄(lerna.json中設(shè)定的目錄)

$ lerna import ~/Product --dest=utilities

lerna link

鏈接互相引用的庫

lerna create

新建包

lerna create <name> [loc]

Create a new lerna-managed package

Positionals:
  name  The package name (including scope), which must be locally unique _and_
        publicly available                                   [string] [required]
  loc   A custom package location, defaulting to the first configured package
        location                                                        [string]

Command Options:
  --access        When using a scope, set publishConfig.access value
                             [choices: "public", "restricted"] [default: public]
  --bin           Package has an executable. Customize with --bin
                  <executableName>                             [default: <name>]
  --description   Package description                                   [string]
  --dependencies  A list of package dependencies                         [array]
  --es-module     Initialize a transpiled ES Module
  --homepage      The package homepage, defaulting to a subpath of the root
                  pkg.homepage                                          [string]
  --keywords      A list of package keywords                             [array]
  --license       The desired package license (SPDX identifier)   [default: ISC]
  --private       Make the new package private, never published
  --registry      Configure the package's publishConfig.registry        [string]
  --tag           Configure the package's publishConfig.tag             [string]
  --yes           Skip all prompts, accepting default values
  

參考: https://github.com/lerna/lerna

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兼都,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子稽寒,更是在濱河造成了極大的恐慌扮碧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杏糙,死亡現(xiàn)場(chǎng)離奇詭異慎王,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宏侍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門赖淤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谅河,你說我怎么就攤上這事咱旱∪范” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵莽龟,是天一觀的道長蠕嫁。 經(jīng)常有香客問我,道長毯盈,這世上最難降的妖魔是什么剃毒? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮搂赋,結(jié)果婚禮上赘阀,老公的妹妹穿的比我還像新娘。我一直安慰自己脑奠,他們只是感情好基公,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宋欺,像睡著了一般轰豆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上齿诞,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天酸休,我揣著相機(jī)與錄音,去河邊找鬼祷杈。 笑死斑司,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的但汞。 我是一名探鬼主播宿刮,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼私蕾!你這毒婦竟也來了僵缺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤是目,失蹤者是張志新(化名)和其女友劉穎谤饭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年尔崔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凿将。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戏罢,我是刑警寧澤屋谭,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站龟糕,受9級(jí)特大地震影響桐磁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讲岁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一我擂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缓艳,春花似錦校摩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溪窒,卻和暖如春坤塞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背澈蚌。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工尺锚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惜浅。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像伏嗜,于是被迫代替她去往敵國和親坛悉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理承绸,服務(wù)發(fā)現(xiàn)裸影,斷路器,智...
    卡卡羅2017閱讀 134,714評(píng)論 18 139
  • 1军熏、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,988評(píng)論 3 119
  • NSJSONReadingOptions: NSJSONReadingMutableContainers:返回可變...
    田心今心九日閱讀 421評(píng)論 0 1
  • 文/梅曉珠 自從小靜懂事起轩猩,父親就在外打...
    蔣珠莉閱讀 1,985評(píng)論 47 49
  • #玩卡不卡·每日一抽# 每一位都可以通過這張卡片覺察自己: 1、直覺他叫什么名字荡澎?妞 2均践、他幾歲了? 30 3摩幔、...
    Maggie_AU閱讀 230評(píng)論 0 0