.pnpmfile.cjs
pnpm を使用すると、特別な関数 (フック) を介してインストールプロセスを直接フックできます。 フックは .pnpmfile.cjs というファイルに記述することで定義できます。
デフォルトでは、 .pnpmfile.cjs はロックファイルと同じディレクトリに配置する必要があります。 たとえば、共有ロックファイルを設定した ワークスペース では .pnpmfile.cjs は、モノレポのルートに置く必要があります。
フック
概要
| フック関数 | タイミング | 使い方 | 
|---|---|---|
| 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) {
  // レジストリからダウンロード後に foo@1.x のマニフェストを変更する
  if (pkg.name === 'foo' && pkg.version.startsWith('1.')) {
    // bar@1.x.x の代わりに bar@2.0.0 に書き換える
    pkg.dependencies = {
      ...pkg.dependencies,
      bar: '^2.0.0'
    }
    context.log('bar@1 => bar@2 in dependencies of foo')
  }
  // baz@x.x.x を使うすべてのパッケージで 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
- タイプ: Boolean
.pnpmfile.cjs を無視します。 --ignore-scripts と一緒に使用することで、一切のスクリプトを実行せずにインストールを行うことが可能です。
pnpmfile
- デフォルト: .pnpmfile.cjs
- タイプ: path
- 例: .pnpm/.pnpmfile.cjs
ローカルの pnpmfile の場所。
global-pnpmfile
- デフォルト: null