package.json
パッケージに関する情報を記述したファイルです。 タイトル、作者、依存パッケージなどのメタ情報を含んでいます。 このセクションで説明しているのは、pnpmを含む全ての主要なNode.jsのパッケージマネージャに共通する標準的な内容です。
フィールド
engines
ソフトウェアが(パッケージが)動作するNode.jsとpnpmのバージョンを指定できます。
{
"engines": {
"node": ">=10",
"pnpm": ">=3"
}
}
開発時に使用しているpnpmのバージョンがengines
フィールドに指定したバージョンと一致しない場合、常に失敗し、エラーメッセージを出力するでしょう。
ユーザがengine-strict
設定フラグ (.npmrcを参照) を指定しなければ、このフィールドの役割は助言を与えるだけですし、あなたのパッケージを依存パッケージとしてインストールするときに警告を出力するだけでしょう。
dependenciesMeta
dependenciesMeta.*.injected
追加されたバージョン: v6.20.0
ローカルな依存パッケージについてこの設定項目をtrue
に設定すると、モジュールディレクトリに対象のパッケージのハードリンク(シンボリックリンクではありません)を作成します。
例えば、ワークスペースに次のようなpackage.json
があるなら、card
ディレクトリのnode_modules
に、button
のシンボリックリンクを作成します。
{
"name": "card",
"dependencies": {
"button": "workspace:1.0.0"
}
}
ところで、button
のピア依存関係にreact
があるとどうなるでしょうか。 モノリポに含まれる全てのプロジェクトが、同じバージョンのreact
を使用しているなら何も問題はありません。 しかし、card
の要求するbutton
はreact@16
を要求し、form
がreact@17
を要求しているとしたらどうなるでしょうか。 injected
フィールドを使用しないなら、任意のバージョンのreact
を選択し、button
のdev依存関係としてインストールしなければなりません。 injected
フィールドを使用すれば、パッケージにbutton
を注入しつつ、button
をそれ自体が要求するバージョンのreact
と共にインストールできるようになります。
従って、card
のpackage.json
は次のようになります。
{
"name": "card",
"dependencies": {
"button": "workspace:1.0.0",
"react": "16"
},
"dependenciesMeta": {
"button": {
"injected": true
}
}
}
card
の依存パッケージとしてbutton
のハードリンクを作成します。そして、card/node_modules/button
の依存パッケージとしてreact@16
のシンボリックリンクを作成します。
こちらはform
のpackage.json
です。
{
"name": "form",
"dependencies": {
"button": "workspace:1.0.0",
"react": "17"
},
"dependenciesMeta": {
"button": {
"injected": true
}
}
}
form
の依存パッケージとしてbutton
のハードリンクを作成します。そして、form/node_modules/button
の依存パッケージとしてreact@17
のシンボリックリンクを作成します。
peerDependenciesMeta
このフィールドには、peerDependencies
フィールドに記述した依存パッケージに関連する、追加の情報を記述します。
peerDependenciesMeta.*.optional
この設定項目をtrue
に設定すると、パッケージマネージャーは指定したピア依存関係を任意の(必須ではない)依存パッケージだと認識します。 そのため、利用者が(コンシューマーが)除外したとしても、エラーとして報告することはありません。
例:
{
"peerDependencies": {
"foo": "1"
},
"peerDependenciesMeta": {
"foo": {
"optional": true
},
"bar": {
"optional": true
}
}
}
bar
がpeerDependencies
に指定されていなかったとしても、任意の(必須ではない)依存パッケージとして認識することになるので注意してください。 その場合、pnpmはどのバージョンのbar
でも問題ないと仮定します。 foo
も任意(必須ではない)ですが、バージョンを指定するために必要です。
publishConfig
追加されたバージョン: v3.4.0
パッケージを梱包する(パックする)とき、マニフェストに登場するいくつかのフィールドを上書きできます。 上書きできるフィールドは次のとおりです。
フィールドを上書きするには、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
追加されたバージョン: v6.11.5
初期設定では、パッケージのアーカイブに含まれるファイルのうち、bin
フィールドに列挙されていないファイルには、実行可能ファイルとしてのフラグを設定しません。移植性を考慮しているからです。 executableFiles
フィールドには、実行可能ファイルとしてのフラグ (+x) を設定するべきファイルを指定できます。bin
フィールドに指定したファイルから直接アクセスできないファイルも指定できます。
{
"publishConfig": {
"executableFiles": [
"./dist/shim.js"
]
}
}
publishConfig.directory
追加されたバージョン: v6.7.0
publishConfig.directory
フィールドには、実際に公開するサブディレクトリをpackage.json
からの相対パスで指定できます。
サードパーティのビルドツールを使用する場合など、現在のパッケージを改変した結果を特定のディレクトリに出力する場合を想定しています。
次の例では
"dist"
フォルダーにpackage.json
を配置しなければなりません。
{
"name": "foo",
"version": "1.0.0",
"publishConfig": {
"directory": "dist"
}
}
pnpm.overrides
追加されたバージョン:v5.10.1
このフィールドを指定すると、依存関係グラフにおける任意の依存関係を上書きするようpnpmに指示できるようになります。 全てのパッケージが同じバージョンの依存パッケージを使うように強制したり、バグ修正をバックポートしたり、フォークした依存パッケージへ置き換えるときに役立ちます。
overrides
フィールドは、最上位のプロジェクトでしか設定できないので注意してください。
"pnpm"."overdides"
フィールドは次のように設定します。
{
"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
と指定すると、zoo
の依存関係qar@1
だけを上書きすることになり、他の依存関係には影響しません。
pnpm.packageExtensions
追加されたバージョン: v6.9.0
packageExtensions
フィールドは、追加の情報と共に既存のパッケージ定義を拡張する方法を提供します。 例えば、react-redux
のpeerDependencies
に存在するべきreact-dom
がなかった場合、packageExtensions
フィールドで次のように追加(パッチ)できます。
{
"pnpm": {
"packageExtensions": {
"react-redux": {
"peerDependencies": {
"react-dom": "*"
}
}
}
}
}
packageExtensions
フィールドのキーはパッケージ名、あるいは、パッケージ名とsemver形式のバージョン範囲を組み合わせたものです。つまり、あるパッケージの特定のバージョンだけをパッチできるのです。
{
"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
}
}
}
}
}
}
pnpm.peerDependencyRules.ignoreMissing
追加されたバージョン:v6.26.0
pnpm は、このリストで指定された peerDependencies が存在しなくても警告を出力しません。
たとえば、次の構成では、依存関係が react
を要求しているが、 react
がインストールされていない場合でも、pnpmは警告を出力しません。
{
"pnpm": {
"peerDependencyRules": {
"ignoreMissing": ["react"]
}
}
}
pnpm.peerDependencyRules.allowedVersions
追加されたバージョン:v6.26.0
指定された範囲については peerDependencies が満たされていなくても警告が表示されなくなります。
例えば、react@16
を必要とする依存関係があったとして、それが react@17
でも正常に動くことをあなたが知っている場合、次のような構成を使用できます。
{
"pnpm": {
"peerDependencyRules": {
"allowedVersions": {
"react": "17"
}
}
}
}
これは pnpm に、peerDependencies に react を持っているすべての依存関係について、 react
v17 をインストールすることを許可するように指示します。
pnpm.neverBuiltDependencies
追加されたバージョン:v5.16.0
このフィールドに指定した依存関係のビルドは無視されます。 ここに列挙されたパッケージの「preinstall」、「install」、および「postinstall」スクリプトは、インストール中に実行されません。
"pnpm"."neverBuiltDependencies"
フィールドの例:
{
"pnpm": {
"neverBuiltDependencies": ["fsevents", "level"]
}
}
pnpm.onlyBuiltDependencies
追加されたバージョン:v6.32.0
インストール中に実行することを許可されたパッケージのリスト。 このフィールドが存在する場合、列挙されたパッケージのみがインストールスクリプトを実行できます。
例:
{
"pnpm": {
"onlyBuiltDependencies": ["fsevents"]
}
}