跳轉至主要內容

疑難排解

本文包含解決方法,針對 Lerna 使用者過去使用軟體時遇到的特定問題。

匯入指令

匯入時遇到緩衝區問題

當您嘗試匯入包含許多提交的儲存庫時,可能會出現下列錯誤

DeprecationWarning: Unhandled promise rejections are deprecated

Error: spawnSync /bin/sh ENOBUFS during ImportCommand.execute

解決方案:

執行 lerna import 搭配 --max-buffer 參數,並提供足夠大的數字(以位元組為單位)。撰寫這篇文章時,基礎預設值為 10MB,因此請將此值記住。

無法匯入合併衝突提交

當您嘗試匯入包含需要衝突解決的合併提交時,匯入指令會傳回下列錯誤

lerna ERR! execute Error: Command failed: git am -3
lerna ERR! execute error: Failed to merge in the changes.
lerna ERR! execute CONFLICT (content): Merge conflict in [file]

解決方案

搭配 --flatten 參數執行 lerna import,以「平面」模式匯入歷史記錄,亦即每個合併提交視為合併引進的一項變更。

當 git 樹有未提交的變更而發生失敗

當目前的專案有未提交變更時,您會收到 fatal: ambiguous argument 'HEAD': 錯誤。

解決方案

在使用 lerna import 匯入任何套件前,請確定提交您在 Lerna 專案中的所有變更。

發布命令

在 GitHub/GitHub Enterprise 固定模式中,Publish 未偵測到手動建立的標籤

當透過 網路使用者介面建立版本時,GitHub 和 GitHub Enterprise 會使用輕量級 Git 標籤,而 Lerna 則使用附註標籤。

這可能會造成問題,Lerna 會略過之前已手動執行並透過 GitHub 網路使用者介面標籤的發布版本。

例如,如果發布記錄如下:

  • v1.1.0 發布並透過 lerna publish 標籤
  • v1.2.0 手動發布並透過 GitHub 網路使用者介面標籤
  • v1.2.1 手動發布並透過 GitHub 網路使用者介面標籤

現在執行 lerna publish 會偵測到 v1.1.0,而非 v1.2.1 作為最後發布的標籤。

這項影響取決於您使用 lerna publish 的方式。

  • 發布提示會使用 v1.1.0 作為主要/次要/修補建議的基礎。
  • 當使用 --conventional-commits 旗標時
    • 會根據自 v1.1.0 以來的所有提交(包括 v1.2.0、v1.2.1 等的提交)建議語意化版本控管遞增。
    • 產生的 CHANGELOG.md 檔案將重複 v1.2.0、v1.2.1 等已於先前發布的所有提交。

解決方案:

如果可能,請使用 lerna publish,而非手動發布。

對於新的手動發布,請使用 git tag -a -m <version>,而非使用 GitHub 網路使用者介面。

對於現有的輕量級標籤,可以透過類似的方式將其轉換為附註標籤:

GIT_AUTHOR_NAME="$(git show $1 --format=%aN -s)"
GIT_AUTHOR_EMAIL="$(git show $1 --format=%aE -s)"
GIT_AUTHOR_DATE="$(git show $1 --format=%aD -s)"
GIT_COMMITTER_NAME="$(git show $1 --format=%cN -s)"
GIT_COMMITTER_EMAIL="$(git show $1 --format=%cE -s)"
GIT_COMMITTER_DATE="$(git show $1 --format=%cD -s)"

git tag -a -m $1 -f $1 $1

git push --tags --force

請參閱這個 Stackoverflow 文章,以了解更多詳細資訊。

發布至私人 npm 註冊表(Artifactory、npm Enterprise 等)

如果 lerna publish 執行失敗,請確保您的 package.json 中有以下內容:

	"publishConfig": {
"registry": "https://[registry-url]"
}

您可能還需要將下列內容加入個別套件中的 .npmrc 檔案:

registry = https://[registry-url]
資訊

儘管 lerna.json 檔案中設定了 npmClient,但 Lerna 始終使用 npm 工具來發布套件。這意味著任何 yarnpnpm 組態都不會被偵測到。為了確保成功發布至私人註冊表,請務必透過環境變數或 .npmrc 檔案適當組態 npm

Jest/Visual Studio Code 除錯

你可以使用 Jest 在以 Lerna 管理的套件中除錯測試,方法是使用 Visual Studio Code。使用中斷點進行除錯時,monorepo 中的 <root>/.vscode/launch.json 檔案中以下的 vscode launch configuration 可用。這個範例會針對位於 monorepo 中的單一套件 my-package 啟動 Jest。

{
"name": "Jest my-package",
"type": "node",
"request": "launch",
"address": "localhost",
"protocol": "inspector",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/lerna",
"runtimeArgs": [
"exec",
"--scope",
"my-package",
"--",
"node"
],
"args": [
"${workspaceRoot}/node_modules/jest/bin/jest.js",
"--runInBand",
"--no-cache",
"packages/my-package"
]
}
  • --runInBand 可以避免在多個處理程序之間並列執行測試
  • --no-cache 有助於避免快取問題

已使用 Visual Studio Code v1.19.3 和 Jest v22.1.4 進行測試。