.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
を読み取ります。これはフックの影響を受けません。 In order to ignore a package's build, use the neverBuiltDependencies field.
hooks.updateConfig(config): config | Promise<config>
Added in: v10.8.0
Allows you to modify the configuration settings used by pnpm. This hook is most useful when paired with configDependencies, allowing you to share and reuse settings across different Git repositories.
For example, @pnpm/plugin-better-defaults uses the updateConfig
hook to apply a curated set of recommended settings.
使用例
module.exports = {
hooks: {
updateConfig (config) {
return Object.assign(config, {
enablePrePostScripts: false,
optimisticRepeatInstall: true,
resolutionMode: 'lowest-direct',
verifyDepsBeforeRun: 'install',
})
}
}
}
hooks.afterAllResolved(lockfile, context): lockfile | Promise<lockfile>
シリアライズされる前にロックファイルの出力を変更できます。
引数
lockfile
-pnpm-lock.yaml
にシリアライズされるロックファイル解決の情報を持つオブジェクト。context
- ステップのコンテキストオブジェクト。#log(msg)
メソッドでは、ステップに対してデバッグログを出力できます。
使用例
function afterAllResolved(lockfile, context) {
// ...
return lockfile
}
module.exports = {
hooks: {
afterAllResolved
}
}
既知の制限事項
何もありません - ロックファイルでできることは、この関数を介して変更することができます。 ロックファイルの機能を拡張することもできます。
hooks.preResolution(options): Promise<void>
This hook is executed after reading and parsing the lockfiles of the project, but before resolving dependencies. It allows modifications to the lockfile objects.
引数
options.existsCurrentLockfile
- A boolean that is true if the lockfile atnode_modules/.pnpm/lock.yaml
exists.options.currentLockfile
- The lockfile object fromnode_modules/.pnpm/lock.yaml
.options.existsNonEmptyWantedLockfile
- A boolean that is true if the lockfile atpnpm-lock.yaml
exists.options.wantedLockfile
- The lockfile object frompnpm-lock.yaml
.options.lockfileDir
- The directory where the wanted lockfile is found.options.storeDir
- The location of the store directory.options.registries
- A map of scopes to registry URLs.
hooks.importPackage(destinationDir, options): Promise<string | undefined>
This hook allows to change how packages are written to node_modules
. The return value is optional and states what method was used for importing the dependency, e.g.: clone, hardlink.
引数
destinationDir
- The destination directory where the package should be written.options.disableRelinkLocalDirDeps
options.filesMap
options.force
options.resolvedFrom
options.keepModulesDir
hooks.fetchers
This hook allows to override the fetchers that are used for different types of dependencies. It is an object that may have the following fields:
localTarball
remoteTarball
gitHostedTarball
directory
git
関連する設定
ignorePnpmfile
- Default: false
- Type: Boolean
.pnpmfile.cjs
will be ignored. Useful together with --ignore-scripts
when you
want to make sure that no script gets executed during install.
pnpmfile
- Default: ['.pnpmfile.cjs']
- Type: path[]
- Example: ['.pnpm/.pnpmfile.cjs']
The location of the local pnpmfile(s).
globalPnpmfile
- Default: null
- Type: path
- Example: ~/.pnpm/global_pnpmfile.cjs
グローバルの pnpmfileの場所。 グローバルの pnpmfile は、インストール時にすべてのプロジェクトで使用されます。
ローカルの pnpmfiles を使用することをお勧めします。 pnpm をパッケージマネージャとして採用しないプロジェクトで pnpm を使用する場合にのみ、グローバル pnpmfile を使用してください。