coremltools 仓库内嵌的 Protocol Buffers JavaScript 运行时:安装、protoc 生成与 CommonJS/Closure 集成指南
发布时间:2026/10/13 2:31:58 锦皓数字建站

AI 应用机器学习模型优化【免费下载链接】coremltoolsCore ML tools contain supporting tools for Core ML model conversion, editing, and validation.项目地址https://gitcode.com/gh_mirrors/co/coremltools点击查看免费下载导读本文以 coremltools 仓库内嵌的 protobuf 源码deps/protobuf/js/README.md为主体完整讲解 JavaScript 版 Protocol Buffers官方 npm 包名为google-protobuf的运行时结构、环境搭建、protoc --js_out代码生成参数以及 CommonJS 与 Closure 两种导入风格下的实际用法。读完本文你将掌握如何在本仓库内跑通 JS 运行时的自测流程npm install npm test如何用protoc把.proto文件编译成可直接在浏览器或 Node.js 中使用的 JS 模块以及serializeBinary/deserializeBinary背后的运行时源码原理与已知边界。一、这份文档在仓库中的定位coremltools 是苹果 Core ML 模型的转换、编辑与校验工具集其仓库在 deps/protobuf 目录下整体内嵌了一份 Google Protocol Buffers 的源码树含 C、Java、Python、Objective-C、Ruby、JS 等多个语言运行时与protoc编译器。本文要讲的 deps/protobuf/js/README.md 正是其中 JavaScript 运行时库的使用说明文档它所描述的内容全部可以在同目录的源码与测试中得到印证运行时核心源码message.js、map.js、binary/子目录arith.js、constants.js、decoder.js、encoder.js、reader.js、utils.js、writer.js测试与构建配置package.jsongoogle-protobuf3.19.0、gulpfile.js、*_test.js系列 Jasmine 测试、commonjs/、compatibility_tests/、experimental/目录。因此下文所有命令、参数和 API 描述均以仓库内实际代码为准。二、JS 运行时兼容的三种导入风格根据 README 的说明JavaScript Protocol Buffers 运行时库目前兼容CommonJS 风格导入例如var protos require(my-protos);Closure 风格导入例如goog.require(my.package.MyProto);ES6 风格导入尚未实现。在浏览器中使用时需要通过 Browserify、webpack 或 Closure Compiler 等构建工具在编译期解析导入。仓库内对应这两套测试gulpfile.js中的test任务会分别运行两份独立的测试副本——一份使用 Closure Compiler 风格导入一份使用 CommonJS 导入见 gulpfile.js 的test_closure与test_commonjs串联CommonJS 版产物统一输出到commonjs_out/目录。三、两大核心组件运行时库与 protocREADME 明确指出在 JavaScript 中使用 Protocol Buffers 需要两个组件。3.1 运行时库runtime library最便捷的安装方式是npm install google-protobuf也可以直接使用本目录deps/protobuf/js中的文件不使用 npm 时自 3.3.0 起所需的文件位于binary子目录下即arith.js、constants.js、decoder.js、encoder.js、map.js、message.js、reader.js、utils.js、writer.js。仓库中的 deps/protobuf/js/binary 目录正是这套文件与文档描述一一对应。仓库内嵌版本的信息可以从 package.json 确认包名google-protobuf、版本3.19.0、入口文件google-protobuf.js、许可证 BSD-3-Clause测试命令为node ./node_modules/gulp/bin/gulp.js test。3.2 协议编译器 protocprotoc负责把.proto文件翻译成.js文件。README 提醒protoc 目前无法通过 npm 安装需要从 Protocol Buffers 官方发布页面Releases下载预编译二进制认准Downloads下的protoc-*.zip文件也可以按顶层 README 的指引从源码自行编译。四、环境搭建与运行自测拿到 protoc 之后README 建议先运行随项目提供的测试验证环境可用。步骤从发布页下载 Protocol Buffers 源码压缩包并解压进入名为js的目录即本仓库的 deps/protobuf/js其中包含package.json和一系列测试文件依次执行$ npm install $ npm test如果 protoc 不在默认位置默认假设是../src/protoc可以显式指定注意版本须与运行时兼容$ PROTOC/usr/local/bin/protoc npm testPROTOC环境变量在构建脚本中确实是可配置的gulpfile.js 的var protoc process.env.PROTOC || ../src/protoc;与 README 描述完全一致。测试通过的判定标准会运行两份独立的测试副本Closure 风格与 CommonJS 风格各一份所有 CommonJS 产物可在commonjs_out/目录中查看。从源码看构建与测试流水线如下见 gulpfile.jsClosure 侧genproto_*_closure任务用--js_outlibrarytestproto_libs*,binary:.生成单文件库deps任务调用closure-make-deps生成依赖图最后由 JasmineJASMINE_CONFIG_PATHjasmine.json执行测试CommonJS 侧make_commonjs_out依次完成dist生成google-protobuf.js、各genproto_*_commonjs任务输出到commonjs_out/、commonjs_asserts/commonjs_testdeps用 Closure Compiler 把断言与测试依赖打包成 CommonJS 模块、以及rewrite_tests_for_commonjs.js对测试文件的重写再在commonjs_out/下运行 Jasmine。五、在自有项目中集成两种导入风格5.1 Closure imports构建时运行形如$ protoc --js_outlibrarymyproto_libs,binary:. messages.proto base.protolibrarymyproto_libs使protoc生成单一输出文件本例为myproto_libs.js生成文件会对.proto中定义的所有类型执行goog.provide()例如测试中常见的goog.provide(proto.google.protobuf.DescriptorProto); goog.provide(proto.google.protobuf.DescriptorProto.ExtensionRange); goog.provide(proto.google.protobuf.DescriptorProto.ReservedRange); goog.provide(proto.google.protobuf.EnumDescriptorProto); goog.provide(proto.google.protobuf.EnumOptions);生成代码还会goog.require()核心库中的许多类型并依赖 Google Closure 库因此必须保证goog.provide()/goog.require()机制能同时找到生成的代码、本目录的核心库.js文件、以及 Google Closure 库本身。之后即可按 Closure 风格导入类型goog.require(proto.my.package.MyMessage); var message proto.my.package.MyMessage();不熟悉 Closure / Closure Compiler 的读者可以查阅 Google Closure 官方文档。5.2 CommonJS imports构建时运行形如$ protoc --js_outimport_stylecommonjs,binary:. messages.proto base.proto与 Closure 模式不同CommonJS 模式下protoc会为每个输入文件各生成一个文件本例为messages_pb.js与base_pb.js生成代码依赖核心运行时核心运行时位于名为google-protobuf.js的文件中从 npm 安装时该文件已构建好、可直接使用从源码如本仓库使用时需要先执行gulp dist构建它——对应 gulpfile.js 的dist任务先用protoc生成 well-known types再用 Closure Compiler 以 commonjs/export.js 为入口打包出google-protobuf.js。之后即可按 CommonJS 风格导入var messages require(./messages_pb); var message new messages.MyMessage();export.js中可以看到google-protobuf.js对外暴露的符号清单Map、Message、BinaryReader、BinaryWriter、ExtensionFieldInfo、ExtensionFieldBinaryInfo以及供生成代码内部使用的exportSymbol、inherits、object.extend、typeOf见 commonjs/export.js。仓库中的 commonjs/import_test.js 展示了require(google-protobuf)与require(./test7/test7_pb)的真实组合用法。六、--js_out 标志详解--js_out的完整语法为--js_out[OPTIONS:]output_dir其中OPTIONS用逗号分隔选项有两种形式optval带值或opt布尔开关。所有可用选项的完整说明定义在GeneratorOptions结构体中对应 protobuf 编译器源码src/google/protobuf/compiler/js/js_generator.h中的文档注释。README 给出的两个典型示例--js_outlibrarymyprotos_lib.js,binary:.包含选项librarymyprotos.lib.js与binary输出到当前目录import_style未指定取默认值closure--js_outimport_stylecommonjs,binary:protos包含选项import_stylecommonjs与binary输出到protos目录。关键选项速查选项取值作用import_styleclosure默认/commonjs/commonjs_strict决定生成代码的导入风格commonjs_strict不会把输出暴露到全局作用域library库名仅 Closure 模式生效把多个.proto的生成代码合并为单文件输出binary布尔开关生成基于 binary wire format二进制序列化的代码one_output_file_per_input_file布尔开关每个输入.proto对应一个输出文件gulpfile 的 well-known types 任务即使用它另外在 gulpfile 中还可以看到--experimental_allow_proto3_optional标志用于生成 proto3 optional 字段的测试代码说明该版本 protoc 对 proto3 optional 需要显式开启。七、运行时 API 快速上手README 明确表示 JS 版的 API 尚未得到充分文档化并给出了一段快速示例这是整个 README 唯一的 API 代码示例务必完整掌握var message new MyMessage(); message.setName(John Doe); message.setAge(25); message.setPhoneNumbers([800-555-1212, 800-555-0000]); // Serializes to a UInt8Array. var bytes message.serializeBinary(); var message2 MyMessage.deserializeBinary(bytes);要点解读生成代码为每个消息类型提供构造器new MyMessage()、字段 settersetName/setAge/setPhoneNumbers以及静态反序列化方法MyMessage.deserializeBinary(bytes)serializeBinary()返回的是Uint8Array可无缝对接 ArrayBuffer 类场景网络传输、WebSocket、fetch body 等更多用法参见仓库测试例如 binary/message_test.js 中msg.serializeBinary()与deserializeBinary(serialized)的往返验证以及 binary/proto_test.js 中TestAllTypes序列化/反序列化一致性断言msg与msg.serializeBinary()反解结果相等。commonjs/与compatibility_tests/下的测试同样围绕这套 API 展开。八、源码级原理与使用边界8.1 jspb.Message基类与代码体积控制所有 JS 版 proto 消息的基类为jspb.Message见 message.js。值得注意的设计决策toObject、serializeBinary等常用方法并不定义在基类原型上这是为了避免项目里所有 proto 的未用代码造成体积膨胀方便 Closure Compiler 做死代码消除。因此 README 建议若要在泛型函数里调用这些方法把已知类型的方法作为参数传入如KnownProtoClass.prototype.serializeBinary或使用知道具体类型的 lambda 表达式。基类还提供若干可裁剪的编译期开关goog.define用于进一步控制生成代码规模GENERATE_TO_OBJECT默认开是否生成toObject方法GENERATE_FROM_OBJECT默认仅测试代码开是否生成fromObject方法GENERATE_TO_STRING默认开是否生成toString方法SERIALIZE_EMPTY_TRAILING_FIELDS默认开关闭序列化末尾空字段可减小序列化体积代价是序列化前多遍历一次为向后兼容默认开启项目文档建议关闭。8.2 二进制编解码管线生成代码的二进制序列化最终落到binary/目录的编解码器上binary/writer.jsjspb.BinaryWriter实现 Protocol Buffers 编码规范wire format中定义的全部编码器内部以blocks_累积序列化分块、用BinaryEncoder缓冲当前正在序列化的片段支持beginSubMessage/endSubMessage的子消息嵌套记账binary/reader.jsjspb.BinaryReader实现全部 wire type 的解码器内部持有BinaryDecoder游标并维护一个全局实例缓存池instanceCache_以复用 reader 实例中间层还包括encoder.jsBinaryEncoder、decoder.jsBinaryDecoder、constants.jswire type、字段类型等常量与类型定义与utils.jsconstants.js同时定义了jspb.ByteSourceArrayBuffer | Uint8Array | Arraynumber | string字符串按 base64 编码等核心类型以及ReaderFunction/WriterFunction等回调函数类型约定。8.3 64 位整数与 typed arrays 的硬边界源码注释binary/writer.js给出了三条必须知晓的边界README 未展开但实战中极易踩坑JS 数字只有 53 位精度双精度浮点BinaryWriter不会为超过2^53的整数值做特殊保精度处理——如果需要无损传递 64 位整数例如 hash code不要使用本库本库依赖 typed arrays不能用于不支持它们的旧浏览器为弥补精度缺口binary/arith.js 提供了Int64/UInt64实现——把 64 位整数表示为高、低两个 32 位lo/hi在 JS 的 53 位精度之上实现无损整数运算如cmp、leftShift、rightShift。8.4 map 字段jspb.Mapproto 的map字段在 JS 端由jspb.Map实现map.js。它紧密贴近 ES6 Map API但刻意不依赖外部 polyfill 与 ES6 本身因此可以运行在更广泛的 JS 环境中仓库内maps_test.js与compatibility_tests/v3.1.0/maps_test.js专门覆盖 map 字段的序列化往返。8.5 兼容性测试与实验性目录compatibility_tests 下保留了v3.0.0与v3.1.0两代快照用于验证新版本运行时对旧版生成代码的向后兼容如compatibility_tests/v3.0.0/binary/proto_test.js、v3.0.0/proto3_test.js均与主版本测试结构一致experimental 目录包含实验性运行时runtime/kernel等与代码体积基准benchmarks/code_size属于仍在演进中的部分与稳定 API 相互独立。九、结语与适用前提在 coremltools 仓库的 deps/protobuf/js 中README 描述的是一套完整可用的 JavaScript Protocol Buffers 方案通过 npm 或binary/目录获取运行时通过protoc --js_out按 Closure / CommonJS 风格生成代码再以serializeBinary/deserializeBinary完成与任何语言侧 protobuf 实现互通的二进制序列化。需要特别说明的适用前提是本文命令与参数针对仓库内嵌的google-protobuf 3.19.0版本protoc需与运行时版本一致或兼容README 原话ES6 导入、64 位整数保精度、旧浏览器 typed arrays 等限制在相应版本内仍然成立。若需在本仓库内复现自测请严格按第四节流程在js目录下执行npm install与npm test并通过PROTOC环境变量指向与你所用运行时版本匹配的 protoc。赞分享AI 应用机器学习模型优化【免费下载链接】coremltoolsCore ML tools contain supporting tools for Core ML model conversion, editing, and validation.项目地址https://gitcode.com/gh_mirrors/co/coremltools点击查看免费下载相关推荐Twirp 安装完全指南运行时库、protoc 代码生成器与 Go 项目集成Twirp 安装完全指南运行时库、protoc 代码生成器与 Go 项目集成 Twirp 是一套以 protobuf 服务定义为核心的简单 RPC 框架开发RPC框架后端微服务μpb (upb) 详解MongoDB 仓库内嵌的高性能 C 语言 Protocol Buffers 运行时μpb upb 详解MongoDB 仓库内嵌的高性能 C 语言 Protocol Buffers 运行时 μpb常写作 upb 是一个用 C 语言实现的轻数据库文档数据库后端使用protoc-gen-doc生成Protocol Buffers文档指南使用protoc gen doc生成Protocol Buffers文档指南 项目概述 protoc gen doc是一个Protocol Buffers文档生开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。