本備忘單旨在快速理解 Lerna v6 所涉及的主要概念,顯示了它的常用命令使用清單
現(xiàn)代構(gòu)建系統(tǒng),用于管理和發(fā)布來(lái)自同一存儲(chǔ)庫(kù)的多個(gè) JavaScript/TypeScript 包。
$ npx lerna@latest init
下面是示例目錄結(jié)構(gòu)
├── README.md
├── remixapp # web 應(yīng)用 (remixapp)
│?? ├── src
│?? └── package.json
│
├── packages
│?? ├── footer # 組件(@remixapp/footer)
│ │?? ├── src
│ │?? └── package.json
│ │
│?? └── header # 組件(@remixapp/header)
│ ?? ├── src
│ ?? └── package.json
│
├── lerna.json
└── package.json
它在 package.json 中依賴于它們,如下所示:
"dependencies": {
// ....
"@remixapp/header": "*",
"@remixapp/footer": "*"
}
remixapp 應(yīng)用程序?qū)?code>頁(yè)眉和頁(yè)腳庫(kù),如下所示:
import { Header } from "header";
import { Footer } from "footer";
export default function Home() {
return (
<>
<Header />
<div>Content!</div>
<Footer />
</>
);
}
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"useWorkspaces": true,
"version": "0.0.0"
}
在 lerna.json 中配置 useWorkspaces 告訴 Lerna 將包鏈接過(guò)程委托給你的包管理器 (此功能由 npm、yarn 和 pnpm 支持)。
npx lerna run test --scope=header # 單個(gè)
多個(gè)任務(wù)運(yùn)行
npx lerna run test --scope=header,footer
忽略 header,footer 其它包中運(yùn)行任務(wù)運(yùn)行
npx lerna run build --ignore=header,footer
# 在所有包含它的包中運(yùn)行 npm run my-script
$ lerna run <script> -- [..args]
$ lerna run test
$ lerna run build
# 觀看所有包并在更改時(shí)轉(zhuǎn)換,流式前綴輸出
$ lerna run --parallel watch
# 在所有包中運(yùn)行命令
$ lerna exec -- <command> [..args]
$ lerna exec -- rm -rf ./node_modules
$ lerna exec -- protractor conf.js
| :- | :- |
|---|---|
--npm-client <client> # | 必須是知道如何運(yùn)行 npm 生命周期腳本的可執(zhí)行文件,默認(rèn)值是 npm |
--stream # | 立即從子進(jìn)程流式輸出,以原始包名稱為前綴 |
--parallel # | 類似于 --stream 但完全忽略并發(fā)和拓?fù)渑判?,立即在所有匹配的包中運(yùn)行給定的命令或腳本,并帶有前綴流輸出 |
--no-bail # | 默認(rèn)情況下,如果任何腳本運(yùn)行返回非零退出代碼,lerna run 將退出并出現(xiàn)錯(cuò)誤。傳遞 --no-bail 以禁用此行為 |
--no-prefix # | 當(dāng)輸出為流式傳輸(--stream 或 --parallel)時(shí)禁用包名稱前綴。當(dāng)將結(jié)果傳送到其他進(jìn)程(例如編輯器插件)時(shí),此選項(xiàng)很有用 |
--profile # | 分析腳本執(zhí)行并生成性能配置文件 |
--profile-location <location> # | 您可以為性能配置文件輸出提供自定義位置。提供的路徑將相對(duì)于當(dāng)前工作目錄進(jìn)行解析。 |
useNx=false # | 通過(guò)將 useNx 設(shè)置為 false,您可以使用 lerna 中的遺留任務(wù)運(yùn)行實(shí)現(xiàn) (p-map 和 p-queue),而不是使用由 Nx 提供支持的默認(rèn)現(xiàn)代任務(wù)運(yùn)行器實(shí)現(xiàn)。 |
# 發(fā)布自上次發(fā)布以來(lái)已更改的軟件包
$ lerna publish
# 顯式發(fā)布在當(dāng)前提交中標(biāo)記的包
$ lerna publish from-git
# 顯式發(fā)布注冊(cè)表中不存在最新版本的軟件包
$ lerna publish from-package
# 使用下一個(gè)語(yǔ)義預(yù)發(fā)布版本,例如
$ lerna publish --canary
# 1.0.0 => 1.0.1-alpha.0+${SHA}
# 自上次提交以來(lái)更改的包
# 隨后的金絲雀發(fā)布將產(chǎn)生1.0.1-alpha.1+${SHA}等
$ lerna publish --canary --preid beta
# 1.0.0 => 1.0.1-beta.0+${SHA}
# 以下是等價(jià)的:
$ lerna publish --canary minor
$ lerna publish --canary preminor
# 1.0.0 => 1.1.0-alpha.0+${SHA}
| :- | :- |
|---|---|
--canary # | 使用此標(biāo)志運(yùn)行時(shí),以更精細(xì)的方式(每次提交)發(fā)布包 |
--contents <dir> # | 要發(fā)布的子目錄。 必須適用于所有包,并且必須包含 package.json 文件 |
--dist-tag <tag> # | 使用此標(biāo)志運(yùn)行時(shí),將使用給定的 npm dist-tag(默認(rèn)為 latest)發(fā)布到 npm |
--git-head <sha> # | 打包 tarball 時(shí)將顯式 SHA 設(shè)置為清單上的 gitHead,僅允許使用 from-package 位置 |
--graph-type <all|dependencies> # | 設(shè)置在構(gòu)建包圖時(shí)使用哪種依賴項(xiàng)。默認(rèn)值是依賴項(xiàng),即僅包含包的 package.json 的依賴項(xiàng)部分中列出的包 |
--ignore-scripts # | 傳遞時(shí),此標(biāo)志將在 lerna 發(fā)布期間禁用運(yùn)行生命周期腳本 |
--ignore-prepublish # | 傳遞時(shí),此標(biāo)志將禁用在 lerna 發(fā)布期間運(yùn)行已棄用的預(yù)發(fā)布腳本 |
--legacy-auth # | 發(fā)布需要身份驗(yàn)證的包時(shí),您正在使用僅使用舊版 Base64 用戶名:密碼 的內(nèi)部托管 NPM 注冊(cè)表。這與 NPM 發(fā)布 _auth 標(biāo)志相同 |
--no-git-reset # | 默認(rèn)情況下,lerna publish 確保對(duì)工作樹(shù)的任何更改都已重置 |
--no-granular-pathspec # | 默認(rèn)情況下,lerna publish 將嘗試(如果啟用)git checkout 僅在發(fā)布過(guò)程中臨時(shí)修改的葉包清單 |
--verify-access # | 從歷史上看,lerna 試圖通過(guò)使用給定令牌執(zhí)行一些搶占式 npm API 請(qǐng)求來(lái)快速解決授權(quán)/身份驗(yàn)證問(wèn)題 |
--otp # | 發(fā)布需要雙重身份驗(yàn)證的包時(shí),您可以使用 --otp 指定一次性密碼 |
--preid # | 與同名的 lerna 版本選項(xiàng)不同,該選項(xiàng)只適用于 --canary 版本計(jì)算 |
--pre-dist-tag <tag> # | 與 --dist-tag 的工作方式相同,但僅適用于使用預(yù)發(fā)布版本發(fā)布的軟件包 |
--registry <url> # | 使用此標(biāo)志運(yùn)行時(shí),轉(zhuǎn)發(fā)的 npm 命令將為您的包使用指定的注冊(cè)表 |
--tag-version-prefix # | 此選項(xiàng)允許提供自定義前綴而不是默認(rèn)前綴:v |
--temp-tag # | 傳遞時(shí),此標(biāo)志將更改默認(rèn)發(fā)布過(guò)程,首先將所有更改的包發(fā)布到臨時(shí) dist-tag(lerna-temp),然后將新版本移動(dòng)到 --dist-tag 配置的 dist-tag (默認(rèn)latest) |
--yes # | 使用此標(biāo)志運(yùn)行時(shí),lerna publish 將跳過(guò)所有確認(rèn)提示 |
| :- | :- |
|---|---|
--no-verify-access # | 舊的搶先訪問(wèn)驗(yàn)證現(xiàn)在默認(rèn)關(guān)閉,因此不需要 --no-verify-access |
--skip-npm # | 直接調(diào)用 lerna version |
"publishConfig": {
"access": "public",
"registry": "http://my-registry.com",
"tag": "flippin-sweet",
"directory": "dist"
}
| :- | :- |
|---|---|
access # | 要發(fā)布具有范圍的包(例如,@mycompany/rocks) |
registry # | 通過(guò)設(shè)置注冊(cè)表來(lái)自定義每個(gè)包的注冊(cè)表 |
tag # | 您可以通過(guò)設(shè)置標(biāo)簽來(lái)自定義每個(gè)包的 dist-tag |
directory # | 這個(gè) 非標(biāo)準(zhǔn) 字段允許您像 --contents 一樣自定義發(fā)布的子目錄,但基于每個(gè)包 |
$ lerna version 1.0.1 # 明確的
$ lerna version patch # semver 關(guān)鍵字
$ lerna version # 從提示中選擇
$ lerna version [major | minor | ...]
# 使用下一個(gè)語(yǔ)義版本值
# 這會(huì)跳過(guò)“為...選擇新版本”提示
# 強(qiáng)制所有包版本化
$ lerna version --force-publish
$ lerna version -m "chore(doc): publish %s"
# 提交消息 = "chore(doc): publish v1.0.0"
$ lerna version -m "chore(doc): publish %v"
# 提交消息 = "chore(doc): publish 1.0.0"
major 重大的minor 次要的patch 修補(bǔ)premajor 主要的preminor 初級(jí)prepatch 預(yù)補(bǔ)丁prerelease 預(yù)發(fā)行| :- | :- |
|---|---|
--allow-branch <glob> # | 與啟用 lerna version 的 git 分支匹配的 glob 白名單 |
--amend # | 使用此標(biāo)志運(yùn)行時(shí),lerna version 將在當(dāng)前提交上執(zhí)行所有更改,而不是添加新的 |
--changelog-preset # | 默認(rèn)情況下,更改日志預(yù)設(shè)設(shè)置為 angular |
--conventional-commits # | 使用常規(guī)提交規(guī)范來(lái)確定版本 bump 并生成 CHANGELOG.md 文件 |
--conventional-graduate # | 將使用 * 對(duì)指定的包(逗號(hào)分隔)或所有包進(jìn)行分級(jí) |
--conventional-prerelease # | 預(yù)發(fā)布版本發(fā)布指定的包 |
--create-release <type> # | 根據(jù)更改的包創(chuàng)建正式的 GitHub 或 GitLab 版本 |
--exact # | 在更新的包中精確指定更新的依賴項(xiàng)(沒(méi)有標(biāo)點(diǎn)符號(hào)),而不是與 semver 兼容(使用^) |
--force-publish # | 強(qiáng)制發(fā)布指定的包 |
--git-remote <name> # | 把 git 更改推送到指定的遠(yuǎn)程位置,而不是origin |
--ignore-changes # | 檢測(cè)更改的包時(shí)忽略與 glob 匹配的文件中的更改 |
--ignore-scripts # | 禁用在 lerna version 期間運(yùn)行的生命周期腳本 |
--include-merged-tags # | 在檢測(cè)到更改的包時(shí)包括來(lái)自合并分支的標(biāo)簽 |
--message <msg> # | 此選項(xiàng)別名為 -m 以與 git commit 進(jìn)行奇偶校驗(yàn) |
--no-changelog # | 使用常規(guī)提交時(shí),不要生成任何 CHANGELOG.md 文件 |
--no-commit-hooks # | 允許 git commit hooks 在提交版本更改時(shí)運(yùn)行。通過(guò) --no-commit-hooks 禁用此行為 |
--no-git-tag-version # | 將提交對(duì) package.json 文件的更改并標(biāo)記發(fā)布。通過(guò) --no-git-tag-version 禁用該行為 |
--no-granular-pathspec # | 僅添加在版本控制過(guò)程中更改的葉包清單(可能還有變更日志)。這產(chǎn)生了 git add --packages/*/package.json 的等價(jià)物,但針對(duì)更改的內(nèi)容量身定制 |
--no-private # | 在選擇版本、提交和標(biāo)記版本時(shí)包含私有包。通過(guò) --no-private 禁用此行為 |
--no-push # | 將已提交和標(biāo)記的更改推送到配置的 git remote。通過(guò) --no-push 禁用此行為 |
--preid # | 使用此標(biāo)志運(yùn)行時(shí),lerna 版本將使用指定的預(yù)發(fā)布標(biāo)識(shí)符增加 premajor、preminor、prepatch 或 prerelease semver bumps |
--sign-git-commit # | 此選項(xiàng)類似于同名的 npm 版本選項(xiàng) |
--sign-git-tag # | 此選項(xiàng)類似于同名的 npm 版本選項(xiàng) |
--force-git-tag # | 此選項(xiàng)替換任何現(xiàn)有標(biāo)記而不是失敗 |
--tag-version-prefix # | 此選項(xiàng)允許提供自定義前綴而不是默認(rèn)前綴:v |
--yes # | 使用此標(biāo)志運(yùn)行時(shí),lerna 版本將跳過(guò)所有確認(rèn)提示 |
| :- | :- |
|---|---|
--cd-version # | 將 semver 關(guān)鍵字傳遞給 bump 位置 |
--repo-version # | 將明確的版本號(hào)傳遞給 bump 位置 |
--skip-git # | 請(qǐng)改用 --no-git-tag-version 和 --no-push |
將本地包鏈接在一起,并安裝其余的包依賴項(xiàng)
$ lerna bootstrap -- --production \
--no-optional
$ lerna bootstrap --hoist
| :- | :- |
|---|---|
--hoist [glob] # | 在 repo 根目錄安裝與 glob 匹配的外部依賴項(xiàng),以便它們可用于所有包 |
--strict # | 與提升 (hoist) 一起使用時(shí),會(huì)在發(fā)出版本警告后拋出錯(cuò)誤并停止引導(dǎo) |
--nohoist [glob] # | 不要在 repo 根目錄安裝與 glob 匹配的外部依賴項(xiàng)。這可用于選擇不提升某些依賴項(xiàng) |
--ignore # | 當(dāng)與 bootstrap 命令一起使用時(shí),還可以在 lerna 中設(shè)置 --ignore 標(biāo)志 |
| :- | :- |
|---|---|
--ignore-prepublish # | 跳過(guò)默認(rèn)在引導(dǎo)程序包中運(yùn)行的預(yù)發(fā)布生命周期腳本 |
--ignore-scripts # | 跳過(guò)通常在引導(dǎo)程序包中運(yùn)行(準(zhǔn)備等)的任何生命周期腳本 |
--registry <url> # | 指定 npm 包的倉(cāng)庫(kù)地址 |
--npm-client <client> # | 必須是知道如何安裝 npm 包依賴項(xiàng)的可執(zhí)行文件 |
--use-workspaces # | 啟用與 Yarn Workspaces 的集成(從 yarn@0.27+ 開(kāi)始可用) |
--no-ci # | 在 CI 環(huán)境中調(diào)用 npm ci 而不是 npm install |
--force-local # | 此標(biāo)志會(huì)導(dǎo)致引導(dǎo)命令始終對(duì)本地依賴項(xiàng)進(jìn)行符號(hào)鏈接,而不管匹配的版本范圍如何 |
$ lerna info
lerna notice cli v6.0.0
Environment info:
System(系統(tǒng)):
OS: macOS 12.2
CPU: (8) x64 Apple M1
Binaries(二進(jìn)制文件):
Node: 16.17.0 - /usr/local/bin/node
Yarn: 1.22.10 - /usr/local/bin/yarn
npm: 8.5.0 - /usr/local/bin/npm
Utilities(實(shí)用程序):
Git: 2.33.0 - /opt/homebrew/bin/git
npmPackages:
lerna: ^6.0.0 => 6.0.0
$ lerna exec --scope my-component -- ls -la
$ lerna run --scope toolbar-* test
$ lerna run --scope package-1 --scope *-2 lint
$ lerna exec --ignore package-{1,2,5} -- ls -la
$ lerna run --ignore package-1 test
$ lerna run --ignore package-@(1|2) --ignore package-3 lint
# 列出自最新標(biāo)簽以來(lái)已更改的包的內(nèi)容
$ lerna exec --since -- ls -la
# 對(duì)自 main 以來(lái)發(fā)生更改的所有包運(yùn)行測(cè)試
$ lerna run test --since main
# 列出自 some-branch 以來(lái)發(fā)生變化的所有包
$ lerna ls --since some-branch
# my-component 及其所有依賴項(xiàng)將被引導(dǎo)
$ lerna bootstrap --scope my-component --include-dependencies
$ lerna bootstrap --scope "package-*" --ignore "package-util-*" --include-dependencies
# 所有匹配 “package-util-*” 的包都將被忽略,除非它們是
# 依賴于名稱與 “package-*” 匹配的包
| :- | :- |
|---|---|
--scope <glob> # | 僅包括名稱與給定 glob 匹配的包 |
--ignore <glob> # | 排除名稱與給定 glob 匹配的包 |
--no-private # | 排除私有包 |
--since [ref] # | 僅包括自指定 ref 以來(lái)已更改的包 |
--exclude-dependents # | 使用 --since 運(yùn)行命令時(shí)排除所有傳遞依賴項(xiàng),覆蓋默認(rèn)的“changed”算法 |
--include-dependents # | 無(wú)論 --scope、--ignore 或 --since 是什么,在運(yùn)行命令時(shí)都包括所有傳遞依賴項(xiàng) |
--include-dependencies # | 無(wú)論 --scope、--ignore 或 --since # 是什么,在運(yùn)行命令時(shí)都包括所有傳遞依賴項(xiàng) |
--include-merged-tags # | 使用 --since 運(yùn)行命令時(shí)包括來(lái)自合并分支的標(biāo)簽 |
列出本地程序包,也尊重所有可用的過(guò)濾選項(xiàng)
# 與 lerna list 相同,它本身類似于 ls 命令
lerna ls
# 相當(dāng)于 lerna ls -l,顯示長(zhǎng)輸出
lerna ll
# 相當(dāng)于 lerna ls -la,顯示所有包(包括私有包)
lerna la
| :- | :- |
|---|---|
--json | 顯示為 JSON # |
--ndjson | 換行符分隔 # |
-a,--all | 所有包 # |
-l,--long | 顯示擴(kuò)展信息 # |
-p,--parseable | 顯示可解析的輸出 # |
--toposort | 按拓?fù)渑判?# |
--graph | JSON 格式鄰接依賴關(guān)系圖 # |
創(chuàng)建新的 Lerna 倉(cāng)庫(kù)或?qū)F(xiàn)有倉(cāng)庫(kù)升級(jí)到當(dāng)前版本 Lerna
lerna 不存在,請(qǐng)將其添加到 package.json 中的 devDependencylerna.json 配置文件來(lái)存儲(chǔ)版本號(hào).gitignore,則生成一個(gè)忽略文件$ lerna init --independent
| :- | :- |
|---|---|
--independent # | 使用獨(dú)立版本控制模式 # |
--exact # | 添加或更新 lerna 的本地版本時(shí)將使用插入符范圍 # |
它將配置 lerna.json 以強(qiáng)制所有后續(xù)執(zhí)行完全匹配
{
"command": {
"init": {
"exact": true
}
},
"version": "0.0.0"
}
將一個(gè)包導(dǎo)入到帶有提交歷史的 monorepo
# 開(kāi)始使用 Lerna
$ git init lerna-repo && cd lerna-repo
$ npx lerna init
$ npm install
# 添加提交
$ git add .
# 如果沒(méi)有提交,導(dǎo)入命令將失敗
$ git commit -m "Initial lerna commit"
# 導(dǎo)入其他存儲(chǔ)庫(kù)
$ npx lerna import <外部存儲(chǔ)庫(kù)的路徑>
$ npx lerna import ~/Product --flatten
選項(xiàng)
| :- | :- |
|---|---|
--flatten # | 當(dāng)導(dǎo)入具有沖突的合并提交的存儲(chǔ)庫(kù)時(shí),導(dǎo)入命令將無(wú)法嘗試應(yīng)用所有提交 |
--dest # | 導(dǎo)入倉(cāng)庫(kù)時(shí),可以通過(guò) lerna.json 中列出的目錄來(lái)指定目標(biāo)目錄 |
--preserve-commit # | 每個(gè) git 提交都有一個(gè)作者和一個(gè)提交者 |
將依賴項(xiàng)添加到匹配的包
$ lerna add <package>[@version] \
[--dev] [--exact] [--peer]
選項(xiàng)
| :- | :- |
|---|---|
--dev # | 將新包添加到 devDependencies |
--exact # | 添加具有精確版本(例如 1.0.1)而不是默認(rèn) ^ semver 范圍(例如 ^1.0.1)的新包 |
--peer # | 將新包添加到 peerDependencies |
--registry <url> # | 使用自定義注冊(cè)表安裝目標(biāo)包 |
--no-bootstrap # | 跳過(guò)鏈?zhǔn)?lerna bootstrap |
實(shí)例
# 將 mod-1 包添加到“prefix-”前綴文件夾中的包中
$ lerna add mod-1 packages/prefix-*
# 將 mod-1 安裝到mod-2
$ lerna add mod-1 --scope=mod-2
# 在 devDependencies 中安裝 mod-1 到 mod-2
$ lerna add mod-1 --scope=mod-2 --dev
# 在 peerDependencies 中安裝 mod-1 到 mod-2
$ lerna add mod-1 --scope=mod-2 --peer
# 在除 mod-1 之外的所有模塊中安裝 mod-1
$ lerna add mod-1
# 在所有模塊中安裝 babel-core
$ lerna add babel-core
比較自上次發(fā)布以來(lái)的所有包或單個(gè)包
$ lerna diff [package]
$ lerna diff
$ lerna diff package-name # 區(qū)分一個(gè)特定的包
類似于 lerna changed,此命令運(yùn)行 git diff
從所有包中刪除 node_modules 目錄
$ lerna clean
接受所有過(guò)濾選項(xiàng)。lerna clean 不會(huì)從根 node_modules 目錄中刪除模塊,即使您啟用了 --hoist 選項(xiàng)
運(yùn)行設(shè)置基本緩存選項(xiàng)的向?qū)?/p>
$ lerna add-caching
將所有相互依賴的包符號(hào)鏈接在一起
$ lerna link
--force-local 設(shè)置會(huì)導(dǎo)致鏈接命令始終對(duì)本地依賴項(xiàng)進(jìn)行符號(hào)鏈接
更新配置文件以匹配當(dāng)前安裝的 lerna 版本
$ npm i lerna@latest
$ lerna repair
lerna repair 在升級(jí)后最有用,可確保應(yīng)用新版本 lerna 的任何配置文件更改
感谢您访问我们的网站,您可能还对以下资源感兴趣:
国产成人精品999视频&日本一区二区亚洲人妻精品&久久久精品国产99久久精&99热这里只有成人精品国产&精品国产剧情av一区二区&成人亚洲精品久久久久app&国产精品美女高潮抽搐A片