资讯动态

pnpm update --patches:通过 pnpr 服务器刷新 Registry Revision 而锁定包版本

发布时间:2026/9/20 13:48:30 来源:尧图企业网站定制
包管理器开发工具CLI【免费下载链接】pnpmFast, disk space efficient package manager项目地址https://gitcode.com/gh_mirrors/pn/pnpm点击查看免费下载本篇文章基于 .changeset/pnpr-refreshes-revisions.md 展开pnpm 允许pnpm update --patches通过配置的 pnpr 服务器刷新 registry revisions同时保留已锁定的包版本。读完本文你将掌握 revision 机制的来龙去脉、--patches的命令约束、pnpr 委派刷新的内部实现以及仓库中对应的测试验证方式。一、背景pnpr 与 Registry Revisionpnpr 是什么从仓库结构与 changeset 可以推断pnprpnpm registry 相关组件是本仓库中新架构的 registry 服务端组件客户端pnpm / pacquet可以把解析resolve、校验锁文件verify-lockfile等请求委派给 pnpr 服务器由服务器从上游 registry 拉取包元数据packument与制品tarball并在锁文件中省略 tarball URL。仓库中相关的实现分散在 pnpr/crates/pnprRust 服务端、pnpm/crates/pnpr-clientRust 客户端与 pnpm/npm/pnprnpm 包中。Revisionregistry 侧的制品修订号Revision修订号是 registry 对某个包版本制品的一种追溯标识每当上游发布方更新某个版本对应的制品例如修复打包内容、重新发布 tarballregistry 会递增该版本的 revision。配套的 changeset .changeset/refresh-registry-revisions.md 描述了更完整的机制支持显式选择 revisionversionrN语法pnpm update --patches用于刷新 revision artifacts 而不改变包版本registry-backed 锁文件策略检查能够识别历史 revisionpnpr 会保留来自上游 registry 的安全 revision 历史。在锁文件中revision 记录为revision: N字段。例如 pnpm/crates/cli/tests/suite/pnpr_install/revisions.rs 中的断言# pnpm-lock.yaml通过 pnpr 安装 revision-pkg1.0.0 后 revision: 2 # 注意不包含 tarball: 字段二、pnpm update --patches的核心语义刷新制品而非升级版本pnpm update --patches解决的问题是当依赖的package.json版本区间没有变化、但上游 registry 发布了新的 revision 制品时如何让本地安装拿到新制品。它区别于常规pnpm update常规 update 会重新解析版本区间可能升级包版本--patches则保持锁定的包版本不变只把锁文件中的 revision 推进到 registry 当前提供的最新 revision并重新拉取对应制品。这一点在 pnpm/crates/cli/tests/suite/pnpr_install/revisions.rs 的测试update_patches_refreshes_a_pnpr_revision_without_changing_the_version中得到直接验证初始安装lockfile 中为 revision: 1依赖声明 revision-pkg: ^1.0.0 执行 pnpm update --patches 后 lockfile 中变为 revision: 2且不再包含 revision: 1 lockfile 中仍为 revision-pkg1.0.0版本未变 package.json 保持原样测试断言 saved_manifest manifest node_modules 中的实际代码从 revision one 变为 revision two参数约束从 pnpm/crates/cli/src/cli_args/update.rs 的check_patches_options与第 164 行的错误信息可以看到--patches有严格的组合限制--patches cannot be combined with package selectors, --latest, --interactive, or --global即--patches不能与以下选项同时使用选项原因包选择器如pnpm update foopatch 刷新是全局的、面向全部锁定依赖--latest--latest会忽略版本区间强制取最新与保留锁定版本冲突--interactive交互式挑选版本与批量刷新 revision 冲突--global全局安装目录不参与工作区锁文件 revision 刷新三、两种刷新路径直连 Registry 与委派 pnpr根据 pnpm/crates/cli/tests/suite/pnpr_install/revisions.rs 中的测试刷新有两种运行方式方式一registry 直连在 npmrc 中把 registry 指向 pnpr 提供的 registry 端点测试中通过point_npmrc_registry_at完成# 首次安装 pnpm install # 上游发布了新 revision 后切换/刷新 registry 指向然后 pnpm update --patches此时客户端直接以 registry 协议与 pnpr registry 端点交互锁文件刷新为新的 revision且不写入tarball:字段因为 registry 端点提供的是无 URL 的 lockfile 记录。方式二通过--pnpr-server委派解析测试update_patches_refreshes_a_revision_through_the_pnpr_resolver展示了另一种形态安装与更新都通过--pnpr-server参数把解析委派给 pnpr 服务器并使用PNPM_CONFIG_REGISTRY指明上游# 配置 pnpr 认证写入 npmrc 的 token pnpm config set --locationproject pnpr-server-token token # 安装解析委派给 pnpr PNPM_CONFIG_REGISTRYhttps://registry.example.com pnpm install --pnpr-server https://pnpr.example.com # 上游 revision 从 1 推进到 2 后仅刷新 revision PNPM_CONFIG_REGISTRYhttps://registry.example.com pnpm update --patches --pnpr-server https://pnpr.example.com测试断言刷新后lockfile 中revision: 2不含revision: 1仍然锁定revision-pkg1.0.0package.json未被改写上游 packument 与 tarball 各被请求到mock 断言expect_at_least(1)/expect(1)。委派的条件pnpm/crates/cli/src/cli_args/update.rs 的can_delegate_patch_refresh明确了命令委派给 pnpr 的前提选中了--patches未指定--depth没有额外的 update actions直接依赖组prod / dev / optional全部被包含。满足条件时pnpr_patch_link会构造一个PnprLink其中锁文件策略为PnprLockfilePolicy { frozen: false, prefer_frozen: false, update_patches: true, // 关键标志只刷新 revision不重解析版本 fix: false, only: ..., ignore_manifest_check: false, trust: ..., }从源码结构看update_patches: true是区分patch 刷新与普通安装/更新的核心开关它告诉 pnpr 服务器本次请求只需要把 revision 推进到最新不得改变已锁定的包版本。四、客户端与服务端revision 如何传递客户端解析请求携带 revisionpnpm/crates/pnpr-client/src/resolve.rs 中resolve 请求体带有revision: OptionTarballRevision字段第 96、106、218 行即客户端会把锁文件中的 revision 信息随请求发送给 pnpr 服务器同时请求会携带patches相关过滤第 143、159 行让服务器只返回需要刷新 revision 的制品。服务端校验revision 必须唯一且可溯源pnpm/crates/resolving-npm-resolver/src/create_npm_resolution_verifier/artifact_binding.rs 实现了 registry-backed 的 revision 校验逻辑current_revision_number读取 registry 当前提供的 revision缺失则视为 0当前 revision 必须在发布历史中恰好出现一次否则报错registry metadata revision {N} does not have exactly one matching history entryselect_revision把请求的 revision 绑定到当前记录或它的单条历史记录若被请求的 revision 在历史中被多次宣传、或其 integrity 与 registry 当前/历史元数据不匹配则解析失败lockfile_revision从LockfileResolutionRegistry 或 Tarball 变体中提取 revision供校验层比对。这套校验保证pnpr 从上游 registry 保留的 revision 历史是安全的——每个 revision 号都能唯一对应到一次真实发布从而防止 revision 被伪造或混淆。五、测试验证仓库中的端到端证据pnpm/crates/cli/tests/suite/pnpr_install/revisions.rs 提供了三个端到端测试是理解本特性行为的最佳参照测试验证点revision_install_and_frozen_reinstall_work_through_pnpr通过 pnpr 安装 revision 包后 lockfile 记录revision: 2且不含tarball:删除 node_modules 与 store 后install --frozen-lockfile可完整重装packument 与 tarball mock 均被精确断言只请求一次update_patches_refreshes_a_pnpr_revision_without_changing_the_versionregistry 直连场景update --patches后 revision 1 → 2版本仍为1.0.0package.json 原样保留实际安装代码更新为 revision twoupdate_patches_refreshes_a_revision_through_the_pnpr_resolverpnpr server 委派场景同样的断言并验证通过--pnpr-server走 resolve 请求完成刷新其中第一个测试还验证了 revision 与不可变性的结合通过 pnpr 安装后锁文件不记录 tarball URL而依赖 revision 编号 integrity 寻址的制品路径integrity_addressed_tarball_path这保证了--frozen-lockfile重装的确定性与可复现性。六、使用注意事项版本语义pnpm update --patches只刷新 revision 制品不改变锁定的包版本如需同时升级版本请使用常规pnpm update或pnpm update --latest注意二者不能与--patches组合。组合限制--patches不能与包选择器、--latest、--interactive、--global同时使用违反时命令会直接报错。服务端匹配pnpr 的 resolve / verify-lockfile 请求协议仍处于实验阶段且未版本化。参考 .changeset/pnpr-registry-declarations.md 与 .changeset/pnpr-resolution-mode.md 的说明请求体字段会随版本演进变化pnpr 服务器与客户端需要保持版本匹配旧版服务器会忽略新增字段例如忽略resolutionMode而按默认highest解析。显式 revision 选择如需锁定到某个具体历史 revision可使用rN语法详见 .changeset/refresh-registry-revisions.md例如foo: 1.0.0r3。七、小结pnpm update --patches补全了 revision 工作流中制品需要更新、版本需要冻结这一关键环节在直连 registry 或委派 pnpr 服务器两种形态下它都能把锁文件中的 revision 推进到上游最新值同时确保包版本、package.json 与依赖图不被触碰。底层由 update.rs 的参数校验与update_patches: true委派策略、pnpr-client 的 resolve 请求 的 revision 字段、以及 artifact_binding.rs 的 revision 唯一性校验共同支撑并有 revisions.rs 中的三个端到端测试作为行为契约。对于需要版本冻结、制品热更新的交付场景这是一个值得纳入日常工具链的命令。赞分享包管理器开发工具CLI【免费下载链接】pnpmFast, disk space efficient package manager项目地址https://gitcode.com/gh_mirrors/pn/pnpm点击查看免费下载相关推荐pnpm pnpr 的 OCI 容器镜像服务用 docker / podman / skopeo 向 pnpr 推送镜像pnpm pnpr 的 OCI 容器镜像服务用 docker / podman / skopeo 向 pnpr 推送镜像 导读 本指南讲解 pnpm 项目新引包管理器开发工具CLIpnpm init 自动固定最新版本pnpm 11 的 --init-package-manager 版本锁定机制详解pnpm init 自动固定最新版本pnpm 11 的 init package manager 版本锁定机制详解 导读 pnpm init 现在会把 最新发包管理器开发工具CLIpnpm/pnpr 跨生态发布事务一次事务同时发布 npm 包、Cargo crate 与 Python 发行版pnpm/pnpr 跨生态发布事务一次事务同时发布 npm 包、Cargo crate 与 Python 发行版 导读 pnpm 仓库中的 pnpr多生态私包管理器开发工具CLI上一篇Kubernetes Helm Charts 安装与使用指南 - Tehras Charts下一篇深度解析uthash从宏定义到内存管理的终极C哈希表实现指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价