トラブルシューティング
このドキュメントには、Lernaを使用する際にユーザーが過去に遭遇した特定の問題の解決策が含まれています。
importコマンド
import時のバッファ問題
多くのコミットが含まれるリポジトリをインポートしようとすると、次のようなエラーが発生する可能性があります。
DeprecationWarning: Unhandled promise rejections are deprecated
または
Error: spawnSync /bin/sh ENOBUFS during ImportCommand.execute
解決策:
lerna import
コマンドに--max-buffer
フラグを指定し、十分な大きさの数値(バイト単位)を指定します。この記述時点では、基礎となるデフォルトは10MBなので、それを考慮する必要があります。
マージコンフリクトを含むコミットはインポートできません
コンフリクト解決が必要だったマージコミットを含むリポジトリをインポートしようとすると、importコマンドはエラーで失敗します。
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]
解決策
lerna import
コマンドに--flatten
フラグを指定して、「フラット」モードで履歴をインポートします。つまり、各マージコミットを、マージによって導入された単一の変更としてインポートします。
Gitツリーにコミットされていない変更がある場合に失敗する
現在のプロジェクトに**コミットされていない変更**がある場合、fatal: ambiguous argument 'HEAD':
エラーが発生します。
解決策
lerna import
を使用してパッケージをインポートする前に、Lernaプロジェクトですべての変更をコミットしてください。
publishコマンド
Github/Github Enterpriseで固定モードを使用する場合、手動で作成されたタグがpublishコマンドで検出されない
GithubとGithub Enterpriseは、ウェブUIを通じてリリースが作成されるときに軽量Gitタグを使用しますが、Lernaは注釈付きタグを使用します。
これにより、Lernaが手動で実行され、GithubウェブUIでタグ付けされた以前に公開されたリリースを無視する問題が発生する可能性があります。
たとえば、公開履歴が次のようだったとします。
- v1.1.0が
lerna publish
で公開およびタグ付けされました。 - v1.2.0がGithubウェブUIで手動で公開およびタグ付けされました。
- v1.2.1がGithubウェブUIで手動で公開およびタグ付けされました。
ここでlerna publish
を実行すると、最新のリリースタグとしてv1.2.1ではなくv1.1.0が検出されます。
これの影響は、lerna publish
の使用方法によって異なります。
- publishプロンプトは、メジャー/マイナー/パッチの候補としてv1.1.0を使用します。
--conventional-commits
フラグを使用する場合- v1.1.0以降のすべてのコミット(v1.2.0、v1.2.1などのコミットを含む)に基づいてsemverの増分を提案します。
- 生成されたCHANGELOG.mdファイルには、v1.2.0、v1.2.1などで既にリリースされているすべてのコミットが繰り返されます。
解決策:
可能であれば、手動リリースよりもlerna publish
を使用してください。
新しい手動リリースには、GithubウェブUIを使用する代わりにgit tag -a -m <version>
を使用してください。
既存の軽量タグについては、次のような方法で注釈付きタグに変換できます。
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は、lerna.json
ファイルで設定されたnpmClient
に関係なく、常にnpm
ツールを使用してパッケージを公開します。つまり、yarn
またはpnpm
の設定は検出されません。プライベートレジストリへの公開を成功させるには、環境変数または.npmrc
ファイルを使用してnpm
が正しく設定されていることを確認してください。
Jest / Visual Studio Codeでのデバッグ
Jestテストを、Visual Studio Codeを使用してLernaで管理されているパッケージでデバッグできます。ブレークポイントを使用したデバッグは、モノレポの<root>/.vscode/launch.json
ファイルにある以下のvscode起動構成で動作します。この例では、モノレポにある単一のパッケージ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でテスト済みです。