.pnpmfile.cjs
pnpmでは、特別な関数(フック)を介してインストールプロセスに直接介入できます。フックは、.pnpmfile.cjsというファイルで宣言できます。
デフォルトでは、.pnpmfile.cjsはロックファイルと同じディレクトリに配置する必要があります。たとえば、共有ロックファイルを持つワークスペースでは、.pnpmfile.cjsはモノレポのルートに配置する必要があります。
フック
TL;DR
| フック関数 | プロセス | 用途 | 
|---|---|---|
| hooks.readPackage(pkg, context): pkg | pnpmが依存関係のパッケージマニフェストを解析した後に呼び出されます | 依存関係の package.jsonを変更できます | 
| hooks.afterAllResolved(lockfile, context): lockfile | 依存関係が解決された後に呼び出されます。 | ロックファイルを変更できます。 | 
hooks.readPackage(pkg, context): pkg | Promise<pkg>
解析後、解決前に、依存関係のpackage.jsonを変更できます。これらの変更はファイルシステムに保存されませんが、ロックファイルで解決される内容、ひいてはインストールされる内容に影響します。
変更したい依存関係がすでに解決されている場合は、pnpm-lock.yamlを削除する必要があることに注意してください。
package.jsonへの変更をファイルシステムに保存する必要がある場合は、pnpm patchコマンドを使用して、package.jsonファイルにパッチを適用する必要があります。これは、たとえば依存関係のbinフィールドを削除する場合に役立ちます。
引数
- pkg- パッケージのマニフェスト。レジストリからのレスポンスまたは- package.jsonの内容です。
- context- ステップのコンテキストオブジェクト。メソッド- #log(msg)を使用すると、ステップのデバッグログを使用できます。
使用方法
.pnpmfile.cjsの例(依存関係の依存関係を変更します)
function readPackage(pkg, context) {
  // Override the manifest of foo@1.x after downloading it from the registry
  if (pkg.name === 'foo' && pkg.version.startsWith('1.')) {
    // Replace bar@x.x.x with bar@2.0.0
    pkg.dependencies = {
      ...pkg.dependencies,
      bar: '^2.0.0'
    }
    context.log('bar@1 => bar@2 in dependencies of foo')
  }
  
  // This will change any packages using baz@x.x.x to use baz@1.2.3
  if (pkg.dependencies.baz) {
    pkg.dependencies.baz = '1.2.3';
  }
  
  return pkg
}
module.exports = {
  hooks: {
    readPackage
  }
}
既知の制限事項
readPackage を介して依存関係のマニフェストから scripts フィールドを削除しても、pnpm が依存関係をビルドするのを防ぐことはできません。依存関係をビルドするとき、pnpm はパッケージのアーカイブからパッケージの package.json を読み取りますが、これはフックの影響を受けません。パッケージのビルドを無視するには、pnpm.neverBuiltDependencies フィールドを使用します。
hooks.afterAllResolved(lockfile, context): lockfile | Promise<lockfile>
ロックファイルの出力をシリアル化前に変更できます。
引数
- lockfile-- pnpm-lock.yamlにシリアル化されるロックファイルの解決オブジェクト。
- context- ステップのコンテキストオブジェクト。メソッド- #log(msg)を使用すると、ステップのデバッグログを使用できます。
使用例
function afterAllResolved(lockfile, context) {
  // ...
  return lockfile
}
module.exports = {
  hooks: {
    afterAllResolved
  }
}
既知の制限事項
制限はありません。ロックファイルでできることはすべてこの関数で変更でき、ロックファイルの機能を拡張することさえできます。
関連設定
ignore-pnpmfile
- デフォルト: false
- タイプ: ブール値
.pnpmfile.cjsは無視されます。インストール中にスクリプトが実行されないようにするために、--ignore-scriptsと一緒に使用すると便利です。
pnpmfile
- デフォルト: .pnpmfile.cjs
- タイプ: パス
- 例: .pnpm/.pnpmfile.cjs
ローカルpnpmfileの場所。
global-pnpmfile
- デフォルト: null
- タイプ: パス
- 例: ~/.pnpm/global_pnpmfile.cjs
グローバルpnpmfileの場所。グローバルpnpmfileは、インストール中にすべてのプロジェクトで使用されます。
ローカルpnpmfileを使用することをお勧めします。pnpmをプライマリパッケージマネージャーとして使用しないプロジェクトでpnpmを使用する場合にのみ、グローバルpnpmfileを使用してください。