pnpm update --patches:通过 pnpr 服务器刷新 Registry Revision 而锁定包版本
包管理器开发工具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),仅供参考

相关新闻

ExoPlayer 事件监听与播放事件处理完全指南:Player.Listener、AnalyticsListener 与 PlayerMessage 实战

ExoPlayer 事件监听与播放事件处理完全指南:Player.Listener、AnalyticsListener 与 PlayerMessage 实战

音视频移动开发 【免费下载链接】ExoPlayer An extensible media player for Android 项目地址: https://gitcode.com/gh_mirrors/exop/ExoPlayer 点击查看 免费下载 本文围绕 ExoPlayer 的事件体系展开,系统讲解如何通过 Player.Listener 监听播放状态…

2026/9/20 13:48:31 阅读更多 →
TanStack Table Ember 集成核心:深入解析 emberReactivity() 响应式绑定工厂

TanStack Table Ember 集成核心:深入解析 emberReactivity() 响应式绑定工厂

TanStack Table Ember 集成核心:深入解析 emberReactivity() 响应式绑定工厂 【免费下载链接】table 🤖 Headless UI for building powerful tables & datagrids for TS/JS - React-Table, Vue-Table, Solid-Table, Svelte-Table 项目地址: https:…

2026/9/21 17:53:15 阅读更多 →
英语16种时态表深度解析:从时间轴到实战运用

英语16种时态表深度解析:从时间轴到实战运用

简介:英语16种时态表是一份面向英语学习者的语法归纳文档,系统梳理了从一般现在时、一般过去时、一般将来时到过去将来时、现在完成时、过去完成时等16种时态的构成规则、常用时间状语、典型用法及例句。文档以表格形式呈现,将每种时态的结构…

2026/9/21 16:40:28 阅读更多 →

最新新闻

3个技巧搞定大象公会版本升级,实战项目不踩坑

3个技巧搞定大象公会版本升级,实战项目不踩坑

3个技巧搞定大象公会版本升级,实战项目不踩坑 版本升级后 API 全变了,这是每个开发者在维护老项目时最头疼的事。我在一个电商后台的实战项目中,就因为一次底层框架的强制更新,导致核心业务逻辑崩溃了三天。很多学员问,为什么大厂面试总爱问这种“…

2026/9/21 18:51:40 阅读更多 →
discord.py 内部架构揭秘:Gateway 分片、429 速率限制与事件循环的代码实现原理

discord.py 内部架构揭秘:Gateway 分片、429 速率限制与事件循环的代码实现原理

discord.py 内部架构揭秘:Gateway 分片、429 速率限制与事件循环的代码实现原理 【免费下载链接】discord.py An API wrapper for Discord written in Python. 项目地址: https://gitcode.com/gh_mirrors/di/discord.py discord.py 是 Python 社区最流行的 D…

2026/9/21 18:51:40 阅读更多 →
一文搞懂美国ios账号注册报错与Python自动化实战

一文搞懂美国ios账号注册报错与Python自动化实战

一文搞懂美国ios账号注册报错与Python自动化实战 看了一堆教程还是不会写项目?别慌,咱们直接上代码。 很多开发者盯着“美国ios账号”这几个字,以为是个纯运营问题,其实背后全是工程化思维。你要是在美国区App…

2026/9/21 18:51:40 阅读更多 →
Etherpad Auto-Update Tier 4:基于维护窗口(Maintenance Window)的全自主升级实现解析

Etherpad Auto-Update Tier 4:基于维护窗口(Maintenance Window)的全自主升级实现解析

后端协同办公WebSocket前端富文本 【免费下载链接】etherpad Etherpad: A modern really-real-time collaborative document editor. 项目地址: https://gitcode.com/gh_mirrors/et/etherpad 点击查看 免费下载 Etherpad 的自更新子系统(Auto-Update&am…

2026/9/21 18:51:39 阅读更多 →
在 Zephyr RTOS 中使用 MCK-RA4T1:Renesas RA4T1 电机控制套件开发指南

在 Zephyr RTOS 中使用 MCK-RA4T1:Renesas RA4T1 电机控制套件开发指南

操作系统嵌入式RTOS物联网 【免费下载链接】zephyr Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures. 项目地址: https://gitcode.com/GitHub_Trending/ze/zep…

2026/9/21 18:51:39 阅读更多 →
3个坑点拆解fast迅捷选型,新手避坑指南

3个坑点拆解fast迅捷选型,新手避坑指南

3个坑点拆解fast迅捷选型,新手避坑指南 看了一堆教程还是不会写项目?这是很多刚入行同学的真实写照。大家往往沉迷于刷LeetCode或者背诵语法糖,却忽略了工程化落地的核心: 如何在有限的时间与资源下,选对那个“快”且“稳”的技术栈…

2026/9/21 18:50:39 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →