跳到主要内容
版本:10.x

.pnpmfile.cjs

pnpm 允许你通过特殊函数(钩子)直接挂钩到安装过程中。钩子可以在名为 .pnpmfile.cjs 的文件中声明。

默认情况下,.pnpmfile.cjs 应该与 lockfile 位于同一目录中。例如,在具有共享 lockfile 的工作空间中,.pnpmfile.cjs 应该位于 monorepo 的根目录中。

钩子

简介

钩子函数过程用途
hooks.readPackage(pkg, context): pkg在 pnpm 解析依赖项的包清单后调用允许你修改依赖项的 package.json
hooks.afterAllResolved(lockfile, context): lockfile在依赖项解析完成后调用允许你修改 lockfile

hooks.readPackage(pkg, context): pkg | Promise<pkg>

允许你在解析之前和解析后修改依赖项的 package.json。这些修改不会保存到文件系统中,但会影响 lockfile 中的解析内容,从而影响安装的内容。

注意,如果你已经解析了想要修改的依赖项,你需要删除 pnpm-lock.yaml

提示

如果你需要将 package.json 的更改保存到文件系统中,你需要使用 pnpm patch 命令并修补 package.json 文件。 例如,如果你想删除依赖项的 bin 字段,这可能会很有用。

readPackage 钩子参数

  • pkg - 包的清单。可能是来自注册表的响应或 package.json 的内容。
  • context - 该步骤的上下文对象。方法 #log(msg) 允许你使用该步骤的调试日志。

readPackage 使用示例

.pnpmfile.cjs 示例(更改依赖项的依赖关系):

function readPackage(pkg, context) {
// 从注册表下载后覆盖 foo@1.x 的清单
if (pkg.name === 'foo' && pkg.version.startsWith('1.')) {
// 将 bar@x.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 已知限制

通过 readPackage 删除依赖项清单中的 scripts 字段不会阻止 pnpm 构建该依赖项。在构建依赖项时,pnpm 从包的存档中读取包的 package.json,这不受钩子影响。要忽略包的构建,请使用 neverBuiltDependencies 字段。

hooks.updateConfig(config): config | Promise<config>

添加于:v10.8.0

允许你修改 pnpm 使用的配置设置。当与 configDependencies 配合使用时,这个钩子最为有用,它允许你在不同的 Git 仓库之间共享和重用设置。

例如,@pnpm/better-defaults 使用 updateConfig 钩子来应用一组经过策划的推荐设置。

updateConfig 使用示例

.pnpmfile.cjs
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 输出。

afterAllResolved 钩子参数

  • lockfile - 序列化到 pnpm-lock.yaml 的 lockfile 解析对象。
  • context - 该步骤的上下文对象。方法 #log(msg) 允许你使用该步骤的调试日志。

afterAllResolved 使用示例

.pnpmfile.cjs
function afterAllResolved(lockfile, context) {
// ...
return lockfile
}

module.exports = {
hooks: {
afterAllResolved
}
}

afterAllResolved 已知限制

没有限制 - 任何可以对 lockfile 进行的操作都可以通过这个函数来修改,你甚至可以扩展 lockfile 的功能。

hooks.preResolution(options): Promise<void>

此钩子在读取和解析项目的 lockfile 之后,但在解析依赖项之前执行。它允许修改 lockfile 对象。

preResolution 钩子参数

  • options.existsCurrentLockfile - 一个布尔值,如果 node_modules/.pnpm/lock.yaml 存在则为 true。
  • options.currentLockfile - 来自 node_modules/.pnpm/lock.yaml 的 lockfile 对象。
  • options.existsNonEmptyWantedLockfile - 一个布尔值,如果 pnpm-lock.yaml 存在则为 true。
  • options.wantedLockfile - 来自 pnpm-lock.yaml 的 lockfile 对象。
  • options.lockfileDir - 找到预期 lockfile 的目录。
  • options.storeDir - 存储目录的位置。
  • options.registries - 作用域到注册表 URL 的映射。

hooks.importPackage(destinationDir, options): Promise<string | undefined>

此钩子允许更改包写入 node_modules 的方式。返回值是可选的,用于说明导入依赖项使用的方法,例如:clone、hardlink。

importPackage 钩子参数

  • destinationDir - 应该写入包的目标目录。
  • options.disableRelinkLocalDirDeps
  • options.filesMap
  • options.force
  • options.resolvedFrom
  • options.keepModulesDir

hooks.fetchers

此钩子允许覆盖用于不同类型依赖项的获取器。它是一个对象,可能具有以下字段:

  • localTarball
  • remoteTarball
  • gitHostedTarball
  • directory
  • git

相关配置

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 在安装期间被所有项目使用。

备注

建议使用本地 pnpmfile。只有在使用 pnpm 的项目不使用 pnpm 作为主要包管理器时,才使用全局 pnpmfile。