メインコンテンツまでスキップ
Version: 8.x

.pnpmfile.cjs

pnpm を使用すると、特別な関数 (フック) を介してインストールプロセスを直接フックできます。 フックは .pnpmfile.cjs というファイルに記述することで定義できます。

デフォルトでは、 .pnpmfile.cjs はロックファイルと同じディレクトリに配置する必要があります。 たとえば、共有ロックファイルを設定した ワークスペース では .pnpmfile.cjs は、モノレポのルートに置く必要があります。

フック

TL;DR

フック関数タイミング使い方
hooks.readPackage(pkg, context): pkgpnpm が依存パッケージのマニフェストを解析した後に呼び出されます依存パッケージの 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) メソッドでは、ステップに対してデバッグログを出力できます。

使用例

.pnpmfile.cjs
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
  • タイプ: path
  • 例: ~/.pnpm/global_pnpmfile.cjs

グローバルの pnpmfileの場所。 グローバルの pnpmfile は、インストール時にすべてのプロジェクトで使用されます。

メモ

ローカルの pnpmfiles を使用することをお勧めします。 pnpm をパッケージマネージャとして採用しないプロジェクトで pnpm を使用する場合にのみ、グローバル pnpmfile を使用してください。