.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) {
// レジストリからダウンロード後に 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
- Default: null
- タイプ: path
- 例: ~/.pnpm/global_pnpmfile.cjs
グローバルの pnpmfileの場所。 グローバルの pnpmfile は、インストール時にすべてのプロジェクトで使用されます。
ローカルの pnpmfiles を使用することをお勧めします。 pnpm をパッケージマネージャとして採用しないプロジェクトで pnpm を使用する場合にのみ、グローバル pnpmfile を使用してください。