疑難排解
本文包含解決方法,針對 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
工具來發布套件。這意味著任何 yarn
或 pnpm
組態都不會被偵測到。為了確保成功發布至私人註冊表,請務必透過環境變數或 .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 進行測試。