TensorBoard 的 patch-package 依赖补丁机制:从 npm 补丁制作到 Bazel 构建期集成

发布时间:2026/9/29 2:14:09

TensorBoard 的 patch-package 依赖补丁机制:从 npm 补丁制作到 Bazel 构建期集成 数据可视化机器学习前端后端【免费下载链接】tensorboardTensorFlows Visualization Toolkit项目地址https://gitcode.com/gh_mirrors/te/tensorboard点击查看免费下载导读本文围绕 TensorBoard 仓库中 patches/README.md 所描述的核心主题展开TensorBoard 如何利用patch-package对其 npm/yarn 依赖如bazel/concatjs、angular/build-tooling、protobuf 与 rules_closure 等 Bazel 依赖制作项目专属补丁并在 Bazel 构建期通过yarn_install(post_install_patches ...)直接应用这些补丁文件。读完本文你将掌握 TensorBoard 的补丁制作流程、五个补丁各自解决的问题与修改的源文件、重新生成补丁的完整命令序列以及补丁文件的格式规范如行尾空白检查与--exclude参数陷阱能够在自己的 Bazel rules_nodejs 项目中复刻这套可维护的依赖补丁体系。一、背景为什么 TensorBoard 需要给第三方依赖打补丁TensorBoard 是一个依赖链条极深的大型前端 后端项目Angular 前端通过 Bazel rules_nodejs 构建同时大量使用 protobuf、Closure TemplatesSoy等工具链。当上游依赖的行为与 TensorBoard 的构建方式不兼容时TensorBoard 不能等待上游修复而是通过patch-package对node_modules中的依赖源码直接打补丁并把补丁文件作为一等公民提交进仓库。patch-package是一款 npm 生态工具允许开发者在node_modules中直接修改第三方包源码然后生成统一的.patch文件后续每次执行yarn install/npm install时它会自动把补丁重新应用到新安装的依赖上。在 TensorBoard 中这些补丁被统一存放在仓库根目录的 patches/ 目录下目前包含五个补丁文件补丁文件针对的依赖解决的问题领域bazelconcatjs5.8.1.patchbazel/concatjsrules_nodejs 生态的 TS/Angular 编译规则Angular 21 的.d.ts解析、Ivy 产物声明、TypeScript 沙箱缺失angularbuild-tooling0.0.0-98b30ab5fdeeb1df3278f5257b9a8f07abb76941.patchangular/build-tooling禁用markTopLevelPure优化插件修复打包后空白页protobuf_6_31_1_java_export.patchprotobuf 6.31.1 的 Java 导出规则适配新版 rules_java/protobuf 栈的 javadocopts 与路径规范化检查rules_cc_protobuf.patchrules_cc 的cc/defs.bzl重新导出cc_proto_library符号rules_closure_soy_cli.patchrules_closure 的 Soy 调用适配当前编译器版本的 CLI 参数二、构建期集成post_install_patches与 WORKSPACE 配置一个值得注意的设计决策是TensorBoard 并不在yarn install时通过patch-package自动应用补丁而是在 Bazel 的WORKSPACE文件中通过yarn_install(post_install_patches ...)直接应用已生成的补丁文件。查看仓库根目录的 WORKSPACE 可以看到关键配置yarn_install( name npm, exports_directories_only False, # ts_library 等规则需要访问包内部嵌套 label package_json //:package.json, package_json_remove [scripts.postinstall], # 移除包自身的 postinstall 脚本 patch_args [-p1], # 仍用 patch-package 撰写补丁但在仓库规则内直接应用生成的补丁工件 # 而不是在安装时调用 patch-package post_install_patches [ //patches:angularbuild-tooling0.0.0-98b30ab5fdeeb1df3278f5257b9a8f07abb76941.patch, //patches:bazelconcatjs5.8.1.patch, ], yarn_lock //:yarn.lock, )README 明确指出这种设计的原因在当前 Bazel/CI 环境下在安装期调用 patch-package 的可靠性不如直接应用生成的补丁文件。这正是把撰写补丁与应用补丁解耦的工程实践——补丁的撰写仍用 patch-package 完成保证 diff 格式正确、路径规范而补丁的应用交给 Bazel 仓库规则完成保证构建可复现、可缓存。post_install_patches列表中只出现两个 npm 依赖补丁angular/build-tooling与bazel/concatjs其余三个补丁protobuf、rules_cc、rules_closure则通过http_archive等仓库规则的patches参数应用到 Bazel 外部仓库例如 WORKSPACE 中对io_bazel_rules_closure的声明http_archive( name io_bazel_rules_closure, patch_args [-p1], patches [//patches:rules_closure_soy_cli.patch], ... )三、补丁文件的格式规范与维护红线3.1 行尾空白检查补丁文件是 diff 格式的文本其格式与普通源码不同。TensorBoard 的 CI 会运行 tensorboard/tools/whitespace_hygiene_test.py 检查所有文件的行尾空白但补丁文件有特殊豁免——该脚本的exceptions集合中列出了两个补丁文件exceptions frozenset( [ patches/protobuf_6_31_1_java_export.patch, patches/bazelconcatjs5.8.1.patch, ] )脚本注释解释了原因补丁文件中的空行使用尾随空格标记上下文行这是 patch 格式的硬性要求不能移除见 whitespace_hygiene_test.py。同时脚本还会检查exceptions列表中是否存在过期豁免即不再有行尾空白问题的文件提示维护者清理。不过 README 也强调创建或更新补丁后要确保除这些格式必需的尾随空格外任何行都没有多余的尾随空白。如果手头补丁带有非格式要求的尾随空白可以用以下命令清洗macOS 下sed -i需要空参数:sed -i s/[[:space:]]*$// patches/patch-file.patch3.2--exclude陷阱不要漏掉 package.json 的改动这是 README 标注为Important的一条关键注意事项patch-package默认使用--exclude /package\.json$/因此直接执行yarn patch-package pkg会静默丢弃对包package.json的任何修改。也就是说如果补丁需要修改依赖的package.json例如bazel/concatjs补丁就在 package.json 中新增了typescript直接依赖必须显式传入yarn patch-package pkg --exclude ^$--exclude ^$将排除模式设为不匹配任何路径从而允许 package.json 进入补丁。此外每次重新生成补丁后都要检查git diff patches/确认没有 hunk 被静默丢弃。四、补丁详解一bazelconcatjs5.8.1.patch这是 TensorBoard 前端构建链中最核心的补丁包含三个相互独立的修改对应bazel/concatjs的多个文件见 补丁原文。4.1 修改文件清单node_modules/bazel/concatjs/internal/common/compilation.bzlnode_modules/bazel/concatjs/internal/common/tsconfig.bzlnode_modules/bazel/concatjs/package.json4.2 修改 1停止声明*.ngfactory.*/*.ngsummary.*产物在compilation.bzl的_outputs函数中原逻辑在use_angular_plugin True时额外声明*.ngfactory.mjs、*.ngsummary.mjs等产物。但IvyAngular 的新编译管线已不再生成这些文件导致 Bazel 报错declared output was not created声明的输出未被创建。补丁将这些声明代码整体删除使 Bazel 的产物声明与实际编译行为一致。从 补丁的 diff 可以看到被删除的代码块带有TODO(alexeagle): clean up after Ivy launch注释——这是上游留下的清理标记TensorBoard 通过补丁提前完成了这项工作。4.3 修改 2为 Angular/Material/CDK/NgRx 入口点补充module_roots映射这是补丁中最大的一块改动。从Angular 21 开始APFAngular Package Format打包方式发生变化各包的.d.ts类型定义文件被集中到每个包的types/name.d.ts目录下且只通过package.json的exports字段对外暴露。而 Bazel 的node_modules路径映射无法解析exports导致 TypeScript 编译找不到类型定义。补丁在tsconfig.bzl的create_tsconfig中为以下主包添加了module_roots映射angular/cdk、angular/common、angular/core、angular/material、angular/platform-browser、angular/platform-browser-dynamic每个主包映射到types/*.d.ts通配符路径同时为一批测试入口点做了精确映射见 补丁的映射表angular/cdk/testing/testbed→testing-testbedangular/common/http/testing→http-testingangular/material/checkbox/testing→checkbox-testingangular/material/chips/testing→chips-testingangular/material/core/testing→core-testingangular/material/dialog/testing→dialog-testingangular/material/form-field/testing/control→form-field-testing-controlangular/material/icon/testing→icon-testingangular/material/menu/testing→menu-testingangular/material/select/testing→select-testingngrx/store/testing→ngrx-store-testing注意NgRx 使用包名前缀的类型文件名与 Angular 的types/entry-point.d.ts命名不同ngrx/effects/testing→ngrx-effects-testingREADME 还专门解释了为什么不能把这些映射放进工作区根目录的tsconfig.jsonBazel 生成的 tsconfig 虽然会extends工作区 tsconfig但它会写入自己的compilerOptions.paths而TypeScript 对paths是整体替换而不是合并因此工作区配置中的映射会被覆盖。映射必须存在于 Bazel 生成的 tsconfig 中这正是需要 patchtsconfig.bzl的原因。4.4 修改 3为package.json增加typescript直接依赖bazel/concatjs原先把typescript放在peerDependencies中。在 Bazel 沙箱环境下typescript无法被自动找到因此补丁将其提升为dependencies中的直接依赖dependencies: { protobufjs: 6.8.8, source-map-support: 0.5.9, tsutils: 3.21.0, typescript: 5.9.3 }见 补丁的 package.json hunk4.5 为什么是 5.8.1 而不是 6.xREADME 给出了明确解释rules_nodejs 6.x 移除了 TensorBoard 依赖的大部分构建规则concatjs、esbuild、typescript 等将它们迁移到了独立的 rules_js 项目中。这是一项需要专门升级投入的工作因此 TensorBoard 停留在 rules_nodejs 5.8.1并将完整迁移留待未来版本。4.6 移除计划bazel/concatjs5.8.1 是它的最后发布版本且 rules_nodejs 已被归档上游不会再有修复。README 披露的近期计划是把tsconfig.bzl的映射和compilation.bzl的产物覆盖逻辑迁移到 TensorBoard 自有的ts_library规则位于 tensorboard/defs 下复用 concatjs 的compile_ts而不再打补丁见 tsconfig.bzl hunk 中的 TODO。五、补丁详解二angularbuild-tooling*.patch5.1 修改文件与作用该补丁只修改一个文件node_modules/angular/build-tooling/shared-scripts/angular-optimization/esbuild-plugin.mjs。其作用是禁用markTopLevelPure优化插件。markTopLevelPure插件会剔除cull被判定为纯副作用无关的顶层函数调用。但 TensorBoard 的部分代码在运行时依赖这些顶层调用被剔除后应用打包结果表现为空白页面且控制台无任何报错——这是极难排查的静默故障。补丁将该插件的挂载代码整体注释掉见 补丁原文代价是最终产物体积变大优化机会减少。5.2 文件名追踪固定 commit 的注意事项补丁文件名中的0.0.0-98b30ab5fdeeb1df3278f5257b9a8f07abb76941是angular/build-tooling被钉住的commit 哈希。因此每当该依赖升级时补丁文件必须重命名并在 WORKSPACE 中同步更新引用。这是依赖补丁维护中的一个隐含约定文件名本身即版本标识。5.3 移除计划与 concatjs 补丁一样该补丁的移除被提上日程。angular/build-tooling上游已冻结两个补丁只有在 TensorBoard 前端构建完全迁移出 rules_nodejs 之后才会一起消失。六、补丁详解三protobuf、rules_cc 与 rules_closure 补丁这三个补丁面向 Bazel 外部仓库通过http_archive的patches参数应用属于 protobuf 6.31.1 升级后的兼容性修复。6.1protobuf_6_31_1_java_export.patch修改两个文件见 补丁原文build_defs/java_opts.bzl删除protobuf_java_export中旧的javadocopts变通方案原先针对rules_jvm_external的 issue #1245。在新版 rules_java/protobuf 栈上不再需要。bazel/private/proto_library_rule.bzl新增_is_normalized辅助函数放宽import_prefix/strip_import_prefix的路径规范化检查——允许空字符串作为已规范化值继续工作以适应新版路径处理逻辑def _is_normalized(path): return path or paths.normalize(path) path6.2rules_cc_protobuf.patch只修改cc/defs.bzl一个文件见 补丁原文从 protobuf 的 Bazel 定义中重新导出cc_proto_libraryload(com_google_protobuf//bazel:cc_proto_library.bzl, _protobuf_cc_proto_library cc_proto_library) cc_proto_library _protobuf_cc_proto_library这样本仓库的调用方可以继续通过rules_cc加载cc_proto_library符号同时底层实际使用 protobuf 6.31.1 的仓库布局保持源码兼容。6.3rules_closure_soy_cli.patch只修改closure/templates/closure_java_template_library.bzl一个文件见 补丁原文适配当前仓库使用的编译器/Java 组合依赖列表 flag 从--deps改为--depHeaders当前 Soy 编译器期望的参数名删除旧的--allowExternalCallsflag当前编译器不接受该参数。同时WORKSPACE 中通过 local_repository 引入了一个本地修改版的safe_html_types位于 third_party/safe_html_types因为 rules_closure 的 Soy 工具链仍期望与 protobuf-java 6.x 兼容的类TensorBoard 需要的是经过调整的版本而非任意上游 release——这是与 Soy 工具链兼容的配套措施。七、补丁的重新生成工作流7.1bazel/concatjs补丁的重生成README 给出的完整操作序列其中--exclude ^$是必需的否则 package.json 的 hunk 会被静默丢弃# 1. 编辑依赖源码 vi node_modules/bazel/concatjs/internal/common/compilation.bzl vi node_modules/bazel/concatjs/internal/common/tsconfig.bzl vi node_modules/bazel/concatjs/package.json # 2. 做出修改后重新生成补丁注意 --exclude 参数 yarn patch-package bazel/concatjs --exclude ^$ # 3. 用新补丁文件名更新 WORKSPACE 中的引用7.2angular/build-tooling补丁的重生成# 1. 编辑依赖源码 vi node_modules/angular/build-tooling/shared-scripts/angular-optimization/esbuild-plugin.mjs # 2. 生成补丁 yarn patch-package angular/build-tooling # 3. 用新补丁文件名更新 WORKSPACE 引用7.3 每次重生成后的统一检查清单检查git diff patches/确认没有任何 hunk 消失特别是 package.json 的改动检查补丁行尾是否有多余的空白可通过 whitespace_hygiene_test.py 或sed命令处理若依赖版本号变化导致补丁文件名含版本/commit 标识同步重命名文件并更新 WORKSPACE 中的引用。八、从源码结构看补丁体系的工程启示TensorBoard 的补丁体系体现了三个值得借鉴的工程决策撰写与应用解耦补丁仍用 patch-package 生态撰写格式标准、路径规范但应用时机从yarn install的 postinstall 移到 Bazel 仓库规则post_install_patches/patches参数换来构建期的确定性与 CI 可靠性每个补丁都要有移除计划README 为每个补丁都标注了上游状态已归档、已冻结、不再修复与迁移路径如迁往 tensorboard/defs 的ts_library规则、整体迁出 rules_nodejs避免补丁永久化文件名承载版本信息含 commit 哈希的补丁名让版本升级必须显式重命名防止静默失配。对于同样基于 Bazel rules_nodejs 构建 Angular 应用的团队这套patches/ WORKSPACE的补丁管理方式可以直接迁移复用把补丁作为仓库资产提交、在yarn_install中声明post_install_patches、并为每个补丁保留一份如上所述的修改文件 / 作用 / 重生成步骤 / 移除计划文档可以让依赖适配工作变得透明、可审计、可回归。赞分享数据可视化机器学习前端后端【免费下载链接】tensorboardTensorFlows Visualization Toolkit项目地址https://gitcode.com/gh_mirrors/te/tensorboard点击查看免费下载相关推荐patch-package与npm scripts集成自定义补丁生命周期钩子patch package与npm scripts集成自定义补丁生命周期钩子 你是否曾在项目中遇到依赖包的紧急bug却因等待官方修复而停滞开发是否想过在依开发工具patch-package与npm 7工作区多包项目中的依赖补丁隔离策略patch package与npm 7工作区多包项目中的依赖补丁隔离策略 在现代前端工程化体系中多包项目Monorepo已成为复杂应用的主流组织方式。开发工具深入理解patch-package工作原理如何优雅管理npm依赖补丁深入理解patch package工作原理如何优雅管理npm依赖补丁 patch package是一个强大的npm包管理工具专门用于修复node_modul开发工具上一篇推荐项目React Native HTMLView —— 极简且强大的HTML渲染组件下一篇如何用Torchmeta实现MAML算法模型无关元学习实战教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/29 2:09:09

计算机视觉常用数据集全解析:从MNIST到COCO的选型与实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 2:09:09

PTA寻找大富翁题解:最小堆与Top K问题实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 2:09:09

通达信gbbq文件格式解析:Python读取股本变迁与复权数据

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 5:29:17

ZeroLaunch-rs API测试:接口调试工具集成

ZeroLaunch-rs API测试:接口调试工具集成 🎯 痛点直击:为什么需要API调试工具? 还在为Windows应用启动器的搜索算法性能问题头疼吗?还在手动测试拼音模糊匹配的准确性吗?ZeroLaunch-rs内置的专业调试工具集…

2026/9/29 5:29:17

ZeroLaunch-rs RSS订阅:内容聚合阅读体验

ZeroLaunch-rs RSS订阅:内容聚合阅读体验 📖 引言:信息过载时代的阅读新方式 在信息爆炸的今天,我们每天都要面对海量的资讯内容。传统的浏览器书签和手动访问网站的方式已经无法满足高效获取信息的需求。ZeroLaunch-rs作为一款专…

2026/9/29 5:29:17

Python猫眼电影数据分析与可视化:从爬虫到ECharts大屏实战

简介:这是一份基于Python的猫眼电影数据分析可视化系统的完整设计文档,适合影视行业从业者、数据分析学习者以及需要毕业设计参考的高校学生。系统以requests库自动抓取猫眼公开电影数据,并借助Pandas完成去重、缺失值与异常值清洗&#xff0…

2026/9/29 5:29:17

Vite构建优化实战:从40秒到10秒的产物体积与速度调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 5:24:17

反激电源RCD吸收电路:漏感尖峰与Vds钳位调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑