跳至主要内容
版本: 9.x

.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 [email protected] after downloading it from the registry
if (pkg.name === 'foo' && pkg.version.startsWith('1.')) {
// Replace [email protected] with [email protected]
pkg.dependencies = {
...pkg.dependencies,
bar: '^2.0.0'
}
context.log('bar@1 => bar@2 in dependencies of foo')
}

// This will change any packages using [email protected] to use [email protected]
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
  • 类型: 布尔值

.pnpmfile.cjs 将被忽略。与 --ignore-scripts 一起使用时很有用,因为您希望确保在安装过程中不会执行任何脚本。

pnpmfile

  • 默认值: .pnpmfile.cjs
  • 类型: 路径
  • 示例: .pnpm/.pnpmfile.cjs

本地 pnpmfile 的位置。

global-pnpmfile

  • 默认值: null
  • 类型: 路径
  • 示例: ~/.pnpm/global_pnpmfile.cjs

全局 pnpmfile 的位置。全局 pnpmfile 在所有项目安装过程中使用。

注意

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