故障排除
本文档包含过去用户在使用 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
工具来发布包。这意味着任何yarn
或pnpm
配置都将不会被检测到。为了确保成功发布到私有注册表,请确保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"
]
}
--runInBand
避免在多个进程中并行化测试--no-cache
有助于避免缓存问题
已在 Visual Studio Code v1.19.3 和 Jest v22.1.4 上进行了测试。