PAYATHON 2026

如何让 npm 默认忽略发布未满两个月的包版本?

数据阿明

可以在支持 min-release-age 的 npm 中直接设置发布等待期,不必搭建私有 registry。该选项从 npm 11.10.0 开始提供,单位为天。设为 60,表示默认选择至少约两个月前发布的版本;60 天与两个自然月并不完全相同。npm 官方更新记录

设置当前用户的默认等待期

先查看 npm 版本:

npm --version

如果当前版本支持该选项,运行:

npm config set min-release-age=60 --location=user

配置会写入当前用户的 .npmrc,通常是 ~/.npmrc,作为该用户的默认设置。npm config 文档

如果只想让某个项目使用这项规则,在项目目录下运行:

npm config set min-release-age=60 --location=project

对应的 .npmrc 内容为:

min-release-age=60

解析依赖树时,npm 会按发布时间筛选候选版本,同时遵守 package.json 中的版本约束。如果没有版本能同时满足这两个条件,安装就会报错,npm 不会为了满足等待期而突破版本范围。这项配置也不会让新版本从 registry 的查询结果中消失。min-release-age 配置说明

审查后如何放行较新的版本

在支持 min-release-age-exclude 的 npm 版本中,可以按包名临时豁免。下面的包名和版本号都是示例,使用时需要替换:

npm install example-package@1.2.3 --save-exact --min-release-age-exclude=example-package

该命令只在本次调用中提供豁免,并将直接依赖保存为精确版本。豁免规则按包名匹配,不绑定已审查的某个版本;该包的其他依赖仍需各自满足等待期。不要长期保留宽泛的豁免配置。豁免规则说明

旧版 npm 可以使用 before

如果当前 npm 不支持 min-release-age,但支持 before,可以在每次安装时计算“60 天前”的日期。以下写法适用于 Bash、Zsh 等支持命令替换的 shell:

npm install --before="$(node -p 'new Date(Date.now() - 60 * 86400000).toISOString()')"

before 接收绝对日期,只选择截止日期之前可用的版本。如果将固定日期写入 .npmrc,截止时间不会自动向前移动。要让等待期持续滚动,需要在每次运行时重新计算日期,例如通过自己的 shell 函数或脚本调用 npm。before 配置说明

等待期需要配合哪些检查

等待期能为发现和处置恶意版本留出时间,但不能保证恶意代码一定会在期限内被发现。原问题中“攻击通常很快就会暴露”的判断不能作为安全保证。

还需要留意两点:

  • 保留并审查 package-lock.json 的变化。npm ci 按已有锁文件安装,不会改写锁文件;不要指望它自动把锁定的较新版本替换成较旧版本,也不要把复现安装等同于完成安全审查。npm ci 文档
  • 等待期也可能挡住刚发布的安全修复。如果 npm audit fix 未能完成修复,应检查是否受到发布时间限制,再决定是否审查并放行修复版本。npm 配置文档

备注:内容仅供参考。