package.json
パッケージのマニフェストファイルです。依存関係、タイトル、作成者など、パッケージのすべてのメタデータが含まれています。これは、pnpmを含む主要なNode.JSパッケージマネージャー全体で保持されている標準です。
engines
ソフトウェアが動作するNodeとpnpmのバージョンを指定できます。
{
"engines": {
"node": ">=10",
"pnpm": ">=3"
}
}
ローカル開発中、pnpmのバージョンがengines
フィールドで指定されたものと一致しない場合、pnpmは常にエラーメッセージで失敗します。
ユーザーがengine-strict
設定フラグを設定していない限り(.npmrcを参照)、このフィールドは推奨のみであり、パッケージが依存関係としてインストールされた場合にのみ警告が表示されます。
dependenciesMeta
dependencies
、optionalDependencies
、およびdevDependencies
内で宣言された依存関係に使用される追加のメタ情報。
dependenciesMeta.*.injected
ローカル依存関係に対してこれがtrue
に設定されている場合、パッケージは仮想ストア(node_modules/.pnpm
)にハードリンクされ、仮想ストアからモジュールディレクトリにシンボリックリンクされます。
ローカル依存関係に対してこれがfalse
に設定されているか、設定されていない場合、パッケージはワークスペース内の場所からモジュールディレクトリに直接シンボリックリンクされます。
たとえば、ワークスペース内の次のpackage.json
は、card
のnode_modules
ディレクトリにbutton
へのシンボリックリンクを作成します。
{
"name": "card",
"dependencies": {
"button": "workspace:1.0.0"
}
}
しかし、button
のピア依存関係にreact
がある場合はどうでしょうか?モノレポ内のすべてのプロジェクトで同じバージョンのreact
を使用している場合は問題ありません。しかし、button
がreact@16
を使用するcard
と、react@17
を使用するform
によって必要とされている場合はどうでしょうか?inject
を使用しない場合、react
の単一バージョンを選択し、button
の開発依存関係としてインストールする必要があります。しかし、injected
フィールドを使用すると、button
をパッケージに注入でき、button
はそのパッケージのreact
バージョンでインストールされます。
したがって、これはcard
のpackage.json
になります。
{
"name": "card",
"dependencies": {
"button": "workspace:1.0.0",
"react": "16"
},
"dependenciesMeta": {
"button": {
"injected": true
}
}
}
button
はcard
の依存関係にハードリンクされ、react@16
はcard/node_modules/button
の依存関係にシンボリックリンクされます。
そして、これはform
のpackage.json
になります。
{
"name": "form",
"dependencies": {
"button": "workspace:1.0.0",
"react": "17"
},
"dependenciesMeta": {
"button": {
"injected": true
}
}
}
button
はform
の依存関係にハードリンクされ、react@17
はform/node_modules/button
の依存関係にシンボリックリンクされます。
通常の依存関係とは対照的に、注入された依存関係は宛先フォルダにシンボリックリンクされないため、たとえばビルドスクリプトの実行後に自動的に更新されません。ハードリンクされたフォルダの内容を依存関係パッケージフォルダの最新の状態に更新するには、もう一度pnpm i
を呼び出してください。
pnpm
が変更を検出し、更新するためには、button
パッケージはインストール時に実行されるライフサイクルスクリプトを持っている必要があることに注意してください。たとえば、パッケージはインストール時に再構築できます。"prepare": "pnpm run build"
。どのようなスクリプトでも機能します。たとえば、次のように副作用のない簡単な無関係なコマンドでも機能します。"prepare": "pnpm root"
。
peerDependenciesMeta
このフィールドは、peerDependencies
フィールドにリストされている依存関係に関連する追加情報を示します。
peerDependenciesMeta.*.optional
これがtrueに設定されている場合、選択されたピア依存関係はパッケージマネージャーによってオプションとしてマークされます。したがって、コンシューマーがそれを省略しても、エラーとして報告されなくなります。
たとえば
{
"peerDependencies": {
"foo": "1"
},
"peerDependenciesMeta": {
"foo": {
"optional": true
},
"bar": {
"optional": true
}
}
}
bar
はpeerDependencies
で指定されていませんが、オプションとしてマークされていることに注意してください。したがって、pnpmは、barのどのバージョンでも問題ないと想定します。ただし、foo
はオプションですが、必要なバージョン仕様のみにオプションです。
publishConfig
パッケージをパックする前に、マニフェスト内のいくつかのフィールドを上書きできます。次のフィールドを上書きできます。
フィールドを上書きするには、フィールドの公開バージョンをpublishConfig
に追加します。
たとえば、次のpackage.json
{
"name": "foo",
"version": "1.0.0",
"main": "src/index.ts",
"publishConfig": {
"main": "lib/index.js",
"typings": "lib/index.d.ts"
}
}
次のように公開されます。
{
"name": "foo",
"version": "1.0.0",
"main": "lib/index.js",
"typings": "lib/index.d.ts"
}
publishConfig.executableFiles
デフォルトでは、移植性の理由から、binフィールドにリストされているファイルを除き、結果のパッケージアーカイブで実行可能としてマークされるファイルはありません。executableFiles
フィールドを使用すると、binフィールドから直接アクセスできない場合でも、実行可能フラグ(+x)を設定する必要がある追加のフィールドを宣言できます。
{
"publishConfig": {
"executableFiles": [
"./dist/shim.js"
]
}
}
publishConfig.directory
フィールドpublishConfig.directory
を使用して、現在のpackage.json
を基準とした公開されたサブディレクトリをカスタマイズすることもできます。
指定されたディレクトリに、現在のパッケージの変更されたバージョンがあることが予想されます(通常はサードパーティのビルドツールを使用)。
この例では、
"dist"
フォルダにpackage.json
が含まれている必要があります。
{
"name": "foo",
"version": "1.0.0",
"publishConfig": {
"directory": "dist"
}
}
publishConfig.linkDirectory
- デフォルト: true
- タイプ: Boolean
true
に設定すると、ローカル開発中にプロジェクトがpublishConfig.directory
の場所からシンボリックリンクされます。
たとえば
{
"name": "foo",
"version": "1.0.0",
"publishConfig": {
"directory": "dist"
"linkDirectory": true
}
}
pnpm.overrides
このフィールドを使用すると、pnpmに依存関係グラフ内の依存関係を上書きするように指示できます。これは、すべてのパッケージで単一バージョンの依存関係を使用するように強制したり、修正をバックポートしたり、依存関係をフォークに置き換えたりする場合に役立ちます。
overridesフィールドは、プロジェクトのルートでのみ設定できることに注意してください。
"pnpm"."overrides"
フィールドの例
{
"pnpm": {
"overrides": {
"foo": "^1.0.0",
"quux": "npm:@myorg/quux@^1.0.0",
"bar@^2.1.0": "3.0.0",
"qar@1>zoo": "2"
}
}
}
パッケージセレクターを依存関係セレクターから>
で区切ることで、上書きされた依存関係が属するパッケージを指定できます。たとえば、qar@1>zoo
は、qar@1
のzoo
依存関係のみを上書きし、他の依存関係には上書きしません。
上書きは、直接依存関係の仕様への参照として定義できます。これは、依存関係の名前の先頭に$
を付けることで実現できます。
{
"dependencies": {
"foo": "^1.0.0"
},
"pnpm": {
"overrides": {
"foo": "$foo"
}
}
}
参照されるパッケージは、上書きされたパッケージと一致する必要はありません。
{
"dependencies": {
"foo": "^1.0.0"
},
"pnpm": {
"overrides": {
"bar": "$foo"
}
}
}
pnpm.packageExtensions
packageExtensions
フィールドは、既存のパッケージ定義を追加情報で拡張する方法を提供します。たとえば、react-redux
がpeerDependencies
にreact-dom
を持っている必要があるが、持っていない場合、packageExtensions
を使用してreact-redux
にパッチを適用できます。
{
"pnpm": {
"packageExtensions": {
"react-redux": {
"peerDependencies": {
"react-dom": "*"
}
}
}
}
}
packageExtensions
のキーはパッケージ名またはパッケージ名とセムバー範囲であるため、パッケージの一部のバージョンのみにパッチを適用できます。
{
"pnpm": {
"packageExtensions": {
"react-redux@1": {
"peerDependencies": {
"react-dom": "*"
}
}
}
}
}
packageExtensions
を使用して拡張できるフィールドは、dependencies
、optionalDependencies
、peerDependencies
、およびpeerDependenciesMeta
です。
より大きな例
{
"pnpm": {
"packageExtensions": {
"express@1": {
"optionalDependencies": {
"typescript": "2"
}
},
"fork-ts-checker-webpack-plugin": {
"dependencies": {
"@babel/core": "1"
},
"peerDependencies": {
"eslint": ">= 6"
},
"peerDependenciesMeta": {
"eslint": {
"optional": true
}
}
}
}
}
}
Yarn と同様に、私たちはエコシステム内の壊れたパッケージを修正するために packageExtensions
のデータベースを管理しています。packageExtensions
を使用している場合は、アップストリームに PR を送信し、@yarnpkg/extensions
データベースに拡張機能を寄稿することを検討してください。
pnpm.peerDependencyRules
pnpm.peerDependencyRules.ignoreMissing
pnpm は、このリストにある不足しているピア依存関係に関する警告を表示しません。
例えば、次の設定では、pnpm は依存関係が react
を必要とするが、react
がインストールされていない場合でも警告を表示しません。
{
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": ["react"]
}
}
}
パッケージ名のパターンも使用できます。
{
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": ["@babel/*", "@eslint/*"]
}
}
}
pnpm.peerDependencyRules.allowedVersions
指定された範囲のピア依存関係については、満たされていないピア依存関係の警告は表示されません。
例えば、react@16
を必要とする依存関係がいくつかあるが、react@17
でも問題なく動作することがわかっている場合は、次の設定を使用できます。
{
"pnpm": {
"peerDependencyRules": {
"allowedVersions": {
"react": "17"
}
}
}
}
これにより、pnpm は、ピア依存関係に react を持つ依存関係は、react
v17 のインストールを許可する必要があると認識します。
特定のパッケージのピア依存関係についてのみ警告を抑制することも可能です。例えば、次の設定では、react
v17 は、button
v2 パッケージのピア依存関係にある場合、または任意の card
パッケージの依存関係にある場合にのみ許可されます。
{
"pnpm": {
"peerDependencyRules": {
"allowedVersions": {
"button@2>react": "17",
"card>react": "17"
}
}
}
}
pnpm.peerDependencyRules.allowAny
allowAny
はパッケージ名のパターンの配列であり、パターンに一致するピア依存関係は、peerDependencies
で指定された範囲に関係なく、任意のバージョンから解決されます。例えば
{
"pnpm": {
"peerDependencyRules": {
"allowAny": ["@babel/*", "eslint"]
}
}
}
上記の設定では、@babel/
パッケージまたは eslint
に関連するピア依存関係のバージョンの不一致に関する警告はすべて抑制されます。
pnpm.neverBuiltDependencies
このフィールドを使用すると、特定の依存関係のビルドを無視できます。リストされたパッケージの "preinstall"、"install"、および "postinstall" スクリプトは、インストール中に実行されません。
"pnpm"."neverBuiltDependencies"
フィールドの例
{
"pnpm": {
"neverBuiltDependencies": ["fsevents", "level"]
}
}
pnpm.onlyBuiltDependencies
インストール中に実行を許可するパッケージ名のリスト。このフィールドが存在する場合、リストされたパッケージのみがインストールスクリプトを実行できます。
例
{
"pnpm": {
"onlyBuiltDependencies": ["fsevents"]
}
}
pnpm.onlyBuiltDependenciesFile
この設定オプションを使用すると、pnpm インストールプロセス中にインストールスクリプトの実行を許可するパッケージのみをリストした JSON ファイルを指定できます。これを使用すると、セキュリティを強化したり、インストール中に特定の依存関係のみがスクリプトを実行するようにしたりできます。
例
{
"dependencies": {
"@my-org/policy": "1.0.0"
},
"pnpm": {
"onlyBuiltDependenciesFile": "node_modules/@my-org/policy/onlyBuiltDependencies.json"
}
}
JSON ファイル自体には、パッケージ名の配列が含まれている必要があります。
[
"fsevents"
]
pnpm.allowedDeprecatedVersions
この設定により、特定のパッケージの非推奨警告を抑制できます。
例
{
"pnpm": {
"allowedDeprecatedVersions": {
"express": "1",
"request": "*"
}
}
}
上記の設定では、pnpm は request
の任意のバージョンと express
の v1 についての非推奨警告を表示しません。
pnpm.patchedDependencies
このフィールドは、pnpm patch-commit を実行すると自動的に追加/更新されます。キーはパッケージ名と正確なバージョンである必要のあるディクショナリです。値はパッチファイルへの相対パスである必要があります。
例
{
"pnpm": {
"patchedDependencies": {
"express@4.18.1": "patches/express@4.18.1.patch"
}
}
}
pnpm.allowNonAppliedPatches
true
の場合、patchedDependencies
フィールドのパッチの一部が適用されなかった場合でも、インストールは失敗しません。
{
"pnpm": {
"patchedDependencies": {
"express@4.18.1": "patches/express@4.18.1.patch"
},
"allowNonAppliedPatches": true
}
pnpm.updateConfig
pnpm.updateConfig.ignoreDependencies
依存関係を更新できない場合があります。例えば、依存関係の最新バージョンが ESM を使用し始めたが、プロジェクトはまだ ESM に対応していない場合などです。厄介なことに、このようなパッケージは、pnpm outdated
コマンドによって常に表示され、pnpm update --latest
を実行すると更新されます。ただし、ignoreDependencies
フィールドにアップグレードしたくないパッケージをリストできます。
{
"pnpm": {
"updateConfig": {
"ignoreDependencies": ["load-json-file"]
}
}
}
パターンもサポートされているため、スコープからのパッケージを無視できます: @babel/*
。
pnpm.auditConfig
pnpm.auditConfig.ignoreCves
pnpm audit
コマンドで無視される CVE ID のリスト。
{
"pnpm": {
"auditConfig": {
"ignoreCves": [
"CVE-2022-36313"
]
}
}
}
pnpm.requiredScripts
この配列にリストされたスクリプトは、ワークスペースの各プロジェクトで必須になります。そうでない場合、pnpm -r run <スクリプト名>
は失敗します。
{
"pnpm": {
"requiredScripts": ["build"]
}
}
pnpm.supportedArchitectures
インストールを実行しているシステムのアーキテクチャと一致しない場合でも、オプションの依存関係をインストールしたいアーキテクチャを指定できます。
例えば、次の構成は Windows x64 用のオプションの依存関係をインストールするように指示します。
{
"pnpm": {
"supportedArchitectures": {
"os": ["win32"],
"cpu": ["x64"]
}
}
}
一方、この構成は Windows、macOS、および現在インストールを実行しているシステムのアーキテクチャ用のオプションの依存関係をインストールします。x64 と arm64 の両方の CPU のアーティファクトが含まれています。
{
"pnpm": {
"supportedArchitectures": {
"os": ["win32", "darwin", "current"],
"cpu": ["x64", "arm64"]
}
}
}
さらに、supportedArchitectures
はシステムの libc
の指定もサポートしています。
pnpm.ignoredOptionalDependencies
オプションの依存関係の名前がこの配列に含まれている場合、スキップされます。例えば
{
"pnpm": {
"ignoredOptionalDependencies": ["fsevents", "@esbuild/*"]
}
}
resolutions
pnpm.overrides
と機能的に同じで、このフィールドは Yarn からの移行を容易にするためのものです。
resolutions
と pnpm.overrides
は、パッケージの解決前にマージされます (pnpm.overrides
が優先されます)。これは、Yarn から移行していて、pnpm 用にいくつかのパッケージを調整する必要がある場合に役立ちます。