.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 字段。