.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を使用してください。