跳至主要内容

故障排除

本文档包含过去用户在使用 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 的固定模式下,发布无法检测到手动创建的标签

通过Web UI创建发布时,Github 和 Github Enterprise 使用轻量级 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.json文件中设置的npmClient是什么,Lerna 始终使用npm工具来发布包。这意味着任何yarnpnpm配置都将不会被检测到。为了确保成功发布到私有注册表,请确保npm已使用环境变量或.npmrc文件正确配置。

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 上进行了测试。