pnpm を利用しているプロジェクトで、依存関係の安定性を保つために minimumReleaseAge を設定している方は多いのではないでしょうか。この設定は、リリースされたばかりのパッケージに潜む予期せぬバグからプロジェクトを守るための素晴らしい防衛策です。
私たちのプロジェクトでも、以下のように pnpm-workspace.yaml に設定し、リリース後24時間(1440分)経過したパッケージのみを更新対象とすることで、安定性を確保していました。
minimumReleaseAge: 1440しかし先日、この設定が緊急のセキュリティ対応において足かせとなる事態に直面しました。この記事では、その課題を minimumReleaseAgeExclude を使ってどのように解決したかを紹介します。
minimumReleaseAgeが障壁にある日、プロジェクトで利用している主要なライブラリ(例えば React)に緊急性の高い脆弱性が発見され、即時のセキュリティアップデートが求められました。セキュリティパッチが含まれた新しいバージョンはすでにリリースされていましたが、pnpm update を実行しても minimumReleaseAge の設定により、リリースから24時間経過していないパッチバージョンをインストールすることができませんでした。
一時的に pnpm-workspace.yaml の minimumReleaseAge をコメントアウトしたり、値を 0 に変更したりすることも考えられます。しかし、この方法では対応後に設定を元に戻し忘れるヒューマンエラーのリスクが伴いますし、対応中に他のパッケージまで最新版に更新されてしまう可能性もありました。
minimumReleaseAgeExcludeそこで役立ったのが、pnpm の minimumReleaseAgeExclude という設定です。
この設定を使うと、minimumReleaseAge の制限から特定のパッケージを除外できます。
私たちは、セキュリティアップデートが必要なパッケージを minimumReleaseAgeExclude に指定することで、この問題を解決しました。
minimumReleaseAge: 1440
minimumReleaseAgeExclude:
- react
- react-dom
- '@types/react'
- '@types/react-dom'この設定変更により、react と react-dom および関連する型定義パッケージは minimumReleaseAge の制限を受けなくなり、リリース直後の最新パッチバージョンを即座にインストールできました。一方で、他のパッケージは引き続き24時間の待機期間が適用されるため、プロジェクト全体の安定性を損なうことなく、ピンポイントで必要な対応を迅速に行うことができました。
minimumReleaseAgeExcludeをリセット無事にセキュリティアップデートが完了したら、minimumReleaseAgeExclude の設定を元に戻します。設定を空に戻し、将来の自分や他のチームメンバーのためにコメントを残しておくのが良いでしょう。
minimumReleaseAge: 1440
# Use minimumReleaseAgeExclude temporarily for emergency security vulnerability fixes
minimumReleaseAgeExclude: []このように、一時的な対応であることがわかるようにしておくことで、設定ファイルの見通しが良くなり、メンテナンス性も向上します。
pnpm の minimumReleaseAge はプロジェクトの安定運用に非常に有効な設定ですが、緊急時のセキュリティ対応など、迅速性が求められる場面では柔軟な対応が必要です。
minimumReleaseAgeExclude を活用することで、安定性を維持するという普段の運用方針を崩すことなく、特定のパッケージだけを迅速にアップデートできます。安定運用と緊急対応の両立を実現するための強力な武器として、ぜひ覚えておいてください。
以上、pnpm の minimumReleaseAge と minimumReleaseAgeExclude を活用してセキュリティアップデートした、現場からお送りしました。