跳到主内容

pnpm 10.16

· 一分钟阅读
Zoltan Kochan
pnpm 的首席维护者

次要更改

延迟依赖更新的新设置

最近发生了几起流行软件包被成功攻击的事件。 为了减少安装已损坏版本的风险,我们正在引入一个新的设置,推迟安装新发布的依赖。 在大多数情况下,这种攻击很快就被发现,而且恶意的版本在一个小时内从注册表中删除。

新的设置名为 minimumReleaseAge。 它指定了版本发布后 pnpm 安装之前必须经过的分钟数。 例如,设置 minimumReleaseAge: 1440 可以确保至少在一天前发布的软件包才可以安装。

如果你设置了 minimumReleaseAge,但需要对某些依赖项禁用此限制,则可以在minimumReleaseAgeExclude 设置下列出它们。 例如,通过以下配置,pnpm 将始终安装最新版本的 webpack,无论其发布时间如何:

minimumReleaseAgeExclude:
- webpack

相关问题: #9921

使用查找器函数进行高级依赖项过滤

增加了对 finders 的支持。

过去,pnpm listpnpm why 只能通过名称(以及可选的版本)搜索依赖项。 示例:

pnpm why minimist

打印任何已安装的 minimist 实例的依赖链:

verdaccio 5.20.1
├─┬ handlebars 4.7.7
│ └── minimist 1.2.8
└─┬ mv 2.1.1
└─┬ mkdirp 0.5.6
└── minimist 1.2.8

如果我们想通过 其他属性 来搜索,而不仅仅是它的名称? 例如,查找所有在对等依赖项中具有 react@17 的包?

现在可以使用 "查找器函数"实现。 可以在 .pnpmfile.cjs 中声明查找器函数,并在运行 pnpm listpnpm why 时使用 --find-by=<function name> 标志调用。

假设我们想要找到在对等依赖项中具有 React 17 的任何依赖项。 我们可以将此查找器添加到我们的 .pnpmfile.cjs 中:

module.exports = {
finders: {
react17: (ctx) => {
return ctx.readManifest().peerDependencies?.react === "^17.0.0";
},
},
};

现在我们可以通过运行以下命令来使用这个查找器功能:

pnpm why --find-by=react17

pnpm 将在对等依赖项中找到具有此 React 的所有依赖项,并在依赖关系图中打印它们的确切位置。

@apollo/client 4.0.4
├── @graphql-typed-document-node/core 3.2.0
└── graphql-tag 2.12.6

还可以通过从查找器返回字符串在输出中打印出一些附加信息。 例如,使用以下查找器:

module.exports = {
finders: {
react17: (ctx) => {
const manifest = ctx.readManifest();
if (manifest.peerDependencies?.react === "^17.0.0") {
return `license: ${manifest.license}`;
}
return false;
},
},
};

每个匹配的包还将从其 package.json 中打印出许可证:

@apollo/client 4.0.4
├── @graphql-typed-document-node/core 3.2.0
│ license: MIT
└── graphql-tag 2.12.6
license: MIT

相关 PR: #9946

补丁更改

  • 修复使用 Node.js 24 执行 pnpm 时打印的废弃警告#9529
  • 如果 nodeVersion 没有设置为精确的 semver 版本,则抛出一个错误 #9934
  • pnpm publish 应该能够发布 .tar.gz 文件#9927
  • 使用 Ctrl-C 取消正在运行的进程应该会让 pnpm run 返回非零退出代码 #9626