📦

[対応済]Renovateでpnpmを管理するときはrangeStrategyが必要

2023/05/02に公開

はじめに

最近パッケージマネージャにpnpmを使い始めたのですが、Renovateがちゃんと動いてくれなくておかしいなーと思っていました。重い腰を上げて調べてみたのですが、どうやら現時点(2023/05/02)ではrangeStrategyをつけないと問題があるケースがあるようです。

※この問題は次のIssueが解決されたことで解決しました。

https://github.com/renovatebot/renovate/issues/21438

問題が起きる条件と理由

次の場合に問題が起きます。

  • パッケージのバージョン指定にキャレット(^)を使う
  • 指定された範囲内のアップデートが発生する

この場合アップデートが行われません。その理由は rangeStrategyにあります。

https://docs.renovatebot.com/configuration-options/#rangestrategy

rangeStrategyのデフォルトは "auto" なのですが、このときに次のような動作をします。

  1. Widen peerDependencies
  2. 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"
  3. Otherwise, if the update is outside the existing range, Renovate replaces the range. So "^2.0.0" is replaced by "^3.0.0"
  4. 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, otherwise replace for updates out of range. Works for bundler, composer, npm, yarn, terraform and poetry 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の設定がないのが理由です。

https://github.com/renovatebot/renovate/blob/58aa841d693fb763e9e115c6e5b5bcde85d33abe/lib/modules/manager/npm/update/locked-dependency/index.ts#L7-L24

Issueはこちらです。

https://github.com/renovatebot/renovate/issues/21438

おまけ: dependabotのpnpm対応

dependabotでは長らくpnpmが対応されていなかったのですが、

https://github.com/dependabot/dependabot-core/issues/1736

最近 Pull Request が作られてレビュー中です。近いうちにdependabotでもサポートされそうです。

https://github.com/dependabot/dependabot-core/pull/7081

Discussion