跳转到内容

npmnpm shrinkwrap

OpenClaw 源码检出使用 OpenClawpnpm-lock.yamlOpenClawnpm。已发布的 OpenClaw npm 包使用 npm-shrinkwrap.jsonnpm,即 npm 可发布的依赖锁定文件,因此 包安装过程使用的是发布期间审核过的依赖图。

Shrinkwrap 是随 npm 包一起发布的依赖树的收据。 它告诉 npm 要安装哪些确切的可传递依赖版本。

对于 OpenClaw 版本,这意味着:

  • 已发布的包不会要求 npm 在安装时发明一个新的依赖图;
  • 依赖变更更容易审核,因为它们会出现在锁定文件中;
  • 发布验证可以测试用户将要安装的同一个图;
  • 更容易在发布前发现包大小或原生依赖的意外情况。

Shrinkwrap 不是沙箱。它本身并不能使依赖变得安全,也不 能替代主机隔离、openclaw security audit、包 来源或安装冒烟测试。

简化的心智模型:

文件作用范围含义
pnpm-lock.yamlOpenClaw 源码检出维护者的依赖图
npm-shrinkwrap.json已发布的 npm 包用户的 npm 安装图
package-lock.json本地 npm 应用非 OpenClaw 发布约定

OpenClaw 是一个网关、插件主机、模型路由器和代理运行时。默认 安装可能会影响启动时间、磁盘使用、原生包下载以及 供应链暴露。

Shrinkwrap 为发布审核提供了一个稳定的边界:

  • 审核者可以看到可传递依赖的变动;
  • 包验证器可以拒绝意外的锁定文件偏移;
  • 包验收可以使用将要发布的图进行安装测试;
  • 插件包可以携带自己的锁定依赖图,而不是 依赖根包来拥有仅插件的依赖项。

目标不是“更多的锁文件”。目标是具有明确所有权的 可重现的发布安装。

openclaw npm 包和 OpenClaw 拥有的 npm 插件包在发布时包含 npm-shrinkwrap.json。合适的 OpenClaw 拥有的插件 包也可以使用显式的 bundledDependencies 发布,以便将其运行时 依赖文件包含在插件 tarball 中,而不是仅依赖于 安装时的解析。

像这样维护边界:

Terminal window
pnpm deps:shrinkwrap:generate
pnpm deps:shrinkwrap:check

生成器解析 npm 的可发布锁定格式,但拒绝生成的 尚未存在于 pnpm-lock.yaml 中的包版本。这保持了 pnpm 依赖项年龄、覆盖和补丁审查边界的完整性。

仅当有意刷新根包而不触及 插件包时,才使用仅限根目录的命令:

Terminal window
pnpm deps:shrinkwrap:root:generate
pnpm deps:shrinkwrap:root:check

将这些文件作为安全敏感文件进行审查:

  • pnpm-lock.yaml
  • npm-shrinkwrap.json
  • 捆绑的插件依赖负载
  • 任何 package-lock.json 差异

OpenClaw 包验证器要求新的根包 tarball 中包含 shrinkwrap。 插件 npm 发布路径会检查插件本地的 shrinkwrap,安装 包本地的捆绑依赖项,然后打包或发布。包 验证器拒绝已发布的 OpenClaw 包中的 package-lock.json

要检查已发布的根包:

Terminal window
npm pack openclaw@<version> --json --pack-destination /tmp/openclaw-pack
tar -tf /tmp/openclaw-pack/openclaw-<version>.tgz | grep '^package/npm-shrinkwrap.json$'

要检查 OpenClaw 拥有的插件包:

Terminal window
npm pack @openclaw/discord@<version> --json --pack-destination /tmp/openclaw-plugin-pack
tar -tf /tmp/openclaw-plugin-pack/openclaw-discord-<version>.tgz | grep '^package/npm-shrinkwrap.json$'
tar -tf /tmp/openclaw-plugin-pack/openclaw-discord-<version>.tgz | grep '^package/node_modules/'

背景:npm-shrinkwrap.