[対応済]Renovateでpnpmを管理するときはrangeStrategyが必要
はじめに
最近パッケージマネージャにpnpmを使い始めたのですが、Renovateがちゃんと動いてくれなくておかしいなーと思っていました。重い腰を上げて調べてみたのですが、どうやら現時点(2023/05/02)ではrangeStrategyをつけないと問題があるケースがあるようです。
※この問題は次のIssueが解決されたことで解決しました。
問題が起きる条件と理由
次の場合に問題が起きます。
- パッケージのバージョン指定にキャレット(^)を使う
- 指定された範囲内のアップデートが発生する
この場合アップデートが行われません。その理由は rangeStrategyにあります。
rangeStrategyのデフォルトは "auto" なのですが、このときに次のような動作をします。
- Widen peerDependencies
- If an existing range already ends with an "or" operator like "^1.0.0 || ^2.0.0", then Renovate widens it into "^1.0.0 || ^2.0.0 || ^3.0.0"
- Otherwise, if the update is outside the existing range, Renovate replaces the range. So "^2.0.0" is replaced by "^3.0.0"
- Finally, if the update is in-range, Renovate will update the lockfile with the new exact version.
1.と2.の説明は省略します。3.はメジャーアップデートの場合ですが、この場合は正常に動作します。バージョンが1未満の場合も正常に動作します。問題は4.です。アップデートが指定された範囲内のときはロックファイルを更新する仕組みですが、これは rangeStrategy=update-lockfile
の挙動です。しかしこれはpnpmに対応していません。
update-lockfile
= Update the lock file when in-range updates are available, otherwisereplace
for updates out of range. Works forbundler
,composer
,npm
,yarn
,terraform
andpoetry
so far
問題が起きているか確認する方法
RenovateのDashboardに行ってログを見ます。その際に次のようなログが出ていたら問題が起きています。
DEBUG: Unsupported lock file: pnpm-lock.yaml
問題の回避方法
rangeStrategyを bump
に変えるのが良いです。package.jsonもまとめて更新してくれます。
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:base"],
"rangeStrategy": "bump"
}
やったね!
ソースコードとIssue
エラーメッセージで検索すると分かりますが、ここにpnpm-lock.yamlの設定がないのが理由です。
Issueはこちらです。
おまけ: dependabotのpnpm対応
dependabotでは長らくpnpmが対応されていなかったのですが、
最近 Pull Request が作られてレビュー中です。近いうちにdependabotでもサポートされそうです。
Discussion