跳到主要内容

故障排除

本文档包含我们的用户过去在使用 Lerna 时遇到的某些问题的解决方案。

导入命令

导入期间的缓冲区问题

当您尝试导入包含大量提交的仓库时,可能会遇到如下错误:

DeprecationWarning: Unhandled promise rejections are deprecated

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

解决方案:

使用 --max-buffer 标志运行 lerna import,并提供足够大的数字(以字节为单位)。在撰写本条目时,底层默认值为 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 中手动创建的标签

Github 和 Github Enterprise 在通过 Web UI 创建发布时使用轻量级 Git 标签,而 Lerna 使用带注释的标签。

这可能导致 Lerna 忽略之前已通过 Github Web UI 手动发布和标记的发布。

例如,如果发布历史如下:

  • v1.1.0 使用 lerna publish 发布并打标签
  • v1.2.0 通过 Github Web UI 手动发布并打标签
  • v1.2.1 通过 Github Web UI 手动发布并打标签

现在运行 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 Web UI。

对于现有的轻量级标签,可以使用类似以下的方式将其转换为带注释的标签:

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 始终使用 npm 工具发布包,无论 lerna.json 文件中设置的 npmClient 是什么。这意味着任何 yarnpnpm 配置都不会被检测到。要确保成功发布到私有注册表,请确保使用环境变量或 .npmrc 文件正确配置 npm

Jest / Visual Studio Code 调试

可以使用 Visual Studio Code 调试 Lerna 管理的包中的 Jest 测试。使用下面的 vscode 启动配置,可以在 monorepo 的 <root>/.vscode/launch.json 文件中进行断点调试。此示例为位于 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"
]
}

已在 Visual Studio Code v1.19.3 和 Jest v22.1.4 上测试。