⚙️

パッケージマネージャーで Runtime のバージョンを管理する

に公開

はじめに

Node.js のバージョン管理には、従来から nvm や nodenv といったツールが使われてきました。しかし最近では、パッケージマネージャー自体が Node.js や Deno などの Runtime のバージョンを管理する方法が登場しています。

この記事では、OpenJS Foundation で標準化が進められている devEngines という仕組みを紹介し、npm、pnpm、yarn の各パッケージマネージャーにおける対応状況について解説します。

devEngines とは

devEngines は package.json で開発環境の Runtime のバージョンを指定し、パッケージマネージャーが自動的にダウンロード・インストールする仕組みです。OpenJS Foundation の Package Metadata Interoperability Collab Space で提案され、主に npm のメンテナによって策定されました。

通常のアプリケーション開発では、この devEngines を使用して開発環境の Runtime のバージョンを管理します。

従来の engines フィールドとの違い

従来から存在する engines フィールド(npm / pnpm / yarn)との主な違いは以下の通りです。

  • engines: パッケージの利用者が満たすべき環境要件(ライブラリ公開時に使用)
  • devEngines: パッケージの開発者が使用する環境要件(アプリケーション開発時に使用)
{
  "engines": {
    "node": ">=22.0.0"
  },
  "devEngines": {
    "runtime": {
      "name": "node",
      "version": ">=24.0.0",
      "onFail": "download"
    }
  }
}

devEngines の仕様

devEngines Field Proposal では以下のキーをサポートしています。

  • runtime: JavaScript runtime(Node.js、Deno、Bun など)
  • packageManager: パッケージマネージャー(npm、pnpm、yarn など)
  • cpu: CPU アーキテクチャ
  • os: オペレーティングシステム
  • libc: C 標準ライブラリ

この記事では、runtime フィールドに焦点を当てて解説します。

onFail オプション

onFail オプションで、バージョン要件を満たさない場合の動作を指定できます。

  • ignore: 何もしない
  • warn: 警告を表示して続行
  • error: エラーを表示して終了(仕様上のデフォルト)
  • download: 指定されたバージョンを自動ダウンロード
{
  "devEngines": {
    "runtime": {
      "name": "node",
      "version": ">=24.0.0",
      "onFail": "download"
    }
  }
}

onFail: "download" を指定すると、要件を満たすバージョンが存在しない場合、パッケージマネージャーが自動的にダウンロードを試みます。これにより、nvm や nodenv などの追加ツールなしで Runtime のバージョン管理が可能になります。

パッケージマネージャーごとの対応状況

パッケージマネージャー devEngines 対応 onFail: ignore onFail: warn onFail: error onFail: download 参考リンク
npm 対応 (v10.9.0~) 対応 対応 対応 未実装 PR #7766
pnpm 対応 (v10.14~) 未実装 未実装 未実装 対応 PR #9755
yarn 未対応 - - - -

各パッケージマネージャーの詳細

npm

v10.9.0 で devEngines の対応が完了しましたが、onFail: "download" は未実装です。詳しい説明はないものの、npm の開発チームはセキュリティ上の懸念を理由に、あえて実装を見送っているようです。

利用可能なオプション: onFail: "ignore", onFail: "warn", onFail: "error"

{
  "devEngines": {
    "runtime": {
      "name": "node",
      "version": ">=24.0.0",
      "onFail": "error"
    }
  }
}

pnpm

v10.14.0 で devEngines の対応が完了し、onFail: "download" による自動ダウンロード機能が利用可能です。

利用可能なオプション: onFail: "download"

{
  "devEngines": {
    "runtime": {
      "name": "node",
      "version": ">=24.0.0",
      "onFail": "download"
    }
  }
}

yarn

yarn は devEngines のサポート予定がありません。従来の engines フィールドでバージョン要件を指定することは可能ですが、自動インストールには対応していません。

まとめ

devEngines は OpenJS Foundation で標準化が進められている、package.json で開発環境の runtime バージョンを管理する仕組みです。pnpm では onFail: "download" に対応しており、自動ダウンロードが可能です。npm は検証機能のみ、yarn は未対応という状況です。

Runtime のバージョン管理に悩んでいる方は、npm や pnpm が提供する devEngines を検討しても良いかもしれません。

GitHubで編集を提案

Discussion