常见
Go, TypeScript, C++, Rust 与 WASM 统一原生出代码生成.
这是什么?
此寄存器提供 aptre CLI — 一个生成 protobuf 代码用于 四种语言 不要求您安装原型、原型插件或语言专用工具链。 使用嵌入式 WebAssembly 模块运行 维罗。 。 。 .
关键特性
- 零原生属地 ——原型和插件以 WASM 运行,不需要安装
- 多语种产出 — 从单个命令生成 Go, TypeScript, C++, 和 Rust
- 智能缓存 – 只有在源文件实际更改时才重新生成
- GO 式导入 在您使用熟悉的导入路径
.proto文件
支持的语言
| 语言 | 信件类型 | RPC服务 | 插件 |
|---|---|---|---|
| 走开 | *.pb.go | *_srpc.pb.go | (原始内容存档于2019-09-31) (英语). protobuf-go-lite |
| 类型脚本 | *.pb.ts | *_srpc.pb.ts | (原始内容存档于2018-10-21) (英语). protobuf-es-lite |
| C++ 组合 | *.pb.cc/h | *_srpc.pb.hpp/cpp | 内建原型+ 星点 |
| 锈 | *.pb.rs | *_srpc.pb.rs | 敬礼 (WASI) + (中文(简体) ) 星点 |
稳定型号
信件可以使用 (typeid.id) 选项 :
import "github.com/aperturerobotics/common/typeid/typeid.proto";
message CreateFile {
option (typeid.id) = "fs/create-file";
string path = 1;
}
对于每个原始文件 带有这种消息, aptre generate 写入
*_typeid.pb.go 持有 CreateFileTypeID 常数, a TypeID() 方法,
和文档的 []typeid.Type 清单(OpsTypes 页:1 ops.proto每个对齐
带有构建器的标识符。 发电机在电流内运行 所以不需要
插件二进制 。 生成器拒绝相同文件中的两个信件
标识符; 从多个列表检查中构建一个登记册的应用程序
其余部分.
C++ 构建导入选项并编译 typeid/typeid.pb.cc; 其他
语言忽略它.
通过 WASI 的 Rust 支持
Rust 代码生成使用嵌入式 刚才 建造 protoc-gen-prost,含义 你不需要货物 生锈器 或安装任何 Rust工具链 生成 .pb.rs 文档。 Prost插件完全运行在Wazero Web Assembly 运行时间与protoc本身.
这是由 去 - protoc - gen - pros,它嵌入了 ~600KB WASM 二进制,可以执行完整的prost protobuf 代码生成器.
示例输出
鉴于一个简单的原始文件:
syntax = "proto3";
package echo;
message EchoMsg {
string body = 1;
}
生成的 echo.pb.rs数字 :
// @generated
// This file is @generated by prost-build.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct EchoMsg {
#[prost(string, tag="1")]
pub body: ::prost::alloc::string::String,
}
见 星点 一个完整的例子.
安装
# Run directly (no install needed)
go run github.com/aperturerobotics/common/cmd/aptre@latest generate
# Or install globally
go install github.com/aperturerobotics/common/cmd/aptre@latest
快速启动
- 设置您的项目 带有 Go 和可选类型脚本 :
# Initialize Go module
go mod init github.com/yourorg/yourproject
- 创建原始文件 使用 GO 式导入 :
syntax = "proto3";
package example;
// Import .proto files using Go-style import paths
import "github.com/aperturerobotics/controllerbus/controller/controller.proto";
message GetBusInfoResponse {
repeated controller.Info running_controllers = 1;
}
- 生成代码数字 :
# Stage files for git (required for discovery)
git add -A
# Generate all languages
go run github.com/aperturerobotics/common/cmd/aptre@latest generate
# Generate only Go output
go run github.com/aperturerobotics/common/cmd/aptre@latest generate --language go
# Or with verbose output
go run github.com/aperturerobotics/common/cmd/aptre@latest generate --verbose
CLI 命令
| 命令 | 说明 |
|---|---|
generate | 生成 protobuf 代码( Go, TypeScript, C++, Rust) |
generate --force | 重新生成所有文件, 忽略缓存 |
clean | 删除已生成的文件和缓存 |
deps | 确保安装所有依赖 |
lint | 运行高朗奇林特 |
fix | 用 -- fix 运行 golangci-lint 运行 |
test | 运行测试 |
test --browser | 用 WebAssembly 在浏览器中运行测试 |
format | 格式 与 gofumt 编码 |
outdated | 显示过时的依赖性 |
TLA+ 东加 光谱
aptre-tla 检查 TLA+ 规格 la-ts, (中文(简体) ),
在节点或邦没有Java。 光谱 Foo.tla 每个模型配置检查一次
旁边是: Foo.cfg 和每个 Foo-<variant>.cfgA级 .tla 没有配置是
帮助模块 。 模块名称从 spec 目录解析,然后从
共享模块 tla/数字 :
Surface.tla:规则每个屏幕都为每一个能达到它的人保留.EveryShownActionWorks当一个人看到的每一个行动都成功时 他们;NobodyIsStuck当每个人都有事情要做时,就按住.
# Check every spec under the current directory
bunx aptre-tla
# Check one spec or one directory
bunx aptre-tla pkg/foo/Foo.tla
失败会打印出破损的规则和最短的路径, 每条状态
,命令输出为 1。 项目添加到其检查脚本中作为
"check:tla": "aptre-tla"编辑 @aptre/common/tla 出口报价 findModels
财务报告和审定财务报表 checkModel 对于工具,如承诺钩.
如何运作
这个 aptre 使用嵌入式WebAssembly 生成代码:
- 发现 - 发现
.proto匹配您目标的文件( 默认 ):./*.proto(中文(简体) ) - 缓存 - 检查
.protoc-manifest.json跳过未修改的文件 - 原生生物(WASM) —运行 去 - protoc -wasi (英语) 来解析原型并引用插件
- 插件 —— Go/TS 本地插件, Rust (prost) 的 WASM 插件
- 后处理 - 修复进口和产出格式
建筑
┌─────────────────────────────────────────────────────────────┐
│ aptre CLI │
├─────────────────────────────────────────────────────────────┤
│ wazero runtime │
├─────────────┬─────────────────────────┬─────────────────────┤
│ protoc.wasm │ protoc-gen-prost.wasm │ Native Plugins │
│ (parsing) │ (Rust output) │ (Go, TS, C++) │
└─────────────┴─────────────────────────┴─────────────────────┘
C++ 组合 支助
C++ protobuf 文件 (.pb.cc 财务报告和审定财务报表 .pb.h与其他产出一起产生。 添加 vendor/ 转到包含路径 :
# CMakeLists.txt
include_directories(${PROJECT_SOURCE_DIR}/vendor)
#include "github.com/yourorg/yourproject/example/example.pb.h"
对于StarPC C++服务 *_srpc.pb.hpp 文档提供客户端/服务器根.
配置
生成器使用合理的默认但可以定制:
- 目标: Proto 文件模式(默认值 :
./*.proto(中文(简体) ) - 不包括: 跳过的模式(例如,
vendor/**(中文(简体) ) - 工具目录: 插件二进制位置( 默认 ):
.tools(中文(简体) ) - 缓存备忘文件( 默认 ):
.protoc-manifest.json(中文(简体) )
package.json 配置
当雷波有 package.json, (中文(简体) ), aptre generate 还读取了可选
顶级 aptre 从中配置对象 .
示例
{
"name": "spacewave",
"private": true,
"aptre": {
"languages": ["go", "ts", "cpp", "rust"],
"tsImportBoundaries": ["auth", "bldr", "db", "forge", "identity", "net"]
}
}
aptre.languages
languages 选择要生成的输出语言。 支持的值为
go, (中文(简体) ), ts, (中文(简体) ), cpp, (中文(简体) ), rust, (中文(简体) ), csharp,以及 python. C#和Python是选入.
奥米 languages 以保存已存在的默认值:生成 Go、 C++ 和 Rust
当项目有 go.mod,加 TypeScript 当它有一个 package.json。 。 。 .
CLI 旗帜优先 package.json数字 :
aptre generate --language go
aptre.rust
设置 aptre.rust 制造 aptre generate 将整个图集汇编为
单跑和写一个 Rust 文件 每个计划, 旁边的计划, 即使一个
protobuf包跨越了多个目录. 其它选择的语言
使用每个指令生成器.
{
"aptre": {
"module": "example.com/app",
"languages": ["rust"],
"rust": {
"prostOptions": ["enable_type_names", "btree_map=."],
"exclude": [],
"descriptorSet": "wire/descriptors.bin",
"moduleFile": "wire/messages.rs",
"inventory": ".protoc-rust-files.txt"
}
}
}
module是工程计划前缀的导入路径。 默认 页:1go.mod模块,所以一个没有go.mod必须设定它。 示马斯 下级vendor/保存目录中的导入路径 .prostOptions将按顺序传递到正体插件。 用于类型 名称、确定性地图、框字段和extern_path测绘.exclude列出不编译的图案.descriptorSet收到全图的序式描述符, 包括进口和来源信息,供运行时间反省.moduleFile接收include!每一个生成文件的嵌入声明 在其原生包下,将每个段命名为Prost(snake case,r#关键词).inventory列出每个生成的路径。 下一次运行将删除文件 清单名称,但计划不再产生.
选择方案 --targets。产出首先在内存中构建并写入
只有当它们的字节改变. aptre generate --check --language rust 比较
不写的所有输出, 打印每个 outdated: 路径和退出非零.
检查从不准备依赖性 : rpc 包含 starpc 财务报告和审定财务报表
protoc-gen-starpc-rust 没有构建, 它失败并命名了缺失的插件 ;
运行 aptre deps 先说.
tests/rust-graph/check.bash 生成带有各种类型路径的工程,
检查一下,并运行 Rust 测试 准确的输出.
aptre.tsTypedDecode
tsTypedDecode 制造 protoc-gen-es-lite 生成每次输入的解码器
信件, a switch 在字段号码 直接读到消息,
替换共享的行走器:
{
"aptre": {
"tsTypedDecode": true
}
}
打开用于运行在 JavaScript 解释器中的代码, 如 QuickJS 或 即一个超时编译器,其中输入的解码器更快。 这个 使生成的文件更大,在JIT下,行走者一样快,所以它 默认关闭.
aptre.tsTypedEncode
tsTypedEncode 编码时也这样做 : protoc-gen-es-lite 生成一个
按数字顺序写出每个字段的信件的编码器
与共享的字节行走器相同 。 这需要 @aptre/protobuf-es-lite
1.2.4 或 后经. 同样的理由也适用:对口译和口译人员适用
超时编译器, 把它放在JIT下.
aptre.tsImportBoundaries
tsImportBoundaries 配置生成的 TypeScript protobuf 导入方式
在单簧管内部重写.
默认情况下,同一模块产生的进口仍然相对存在。 这通常是 你想在单打包的回放.
对于生成多位顶级成员的原生取出TypeScript的单体,
当一个构建系统将来源映射到另一个树上时, 相对导入会中断
或每个成员需要稳定的再根导入路径。 在这种情况下,定义
模块相对边界前缀 aptre.tsImportBoundaries。 。 。 .
当生成时 *.pb.ts 文件导入另一个生成的 protobuf 文件 :
- 如果导入仍停留在同一配置的边界内,则仍然相对.
- 如果导入从一个配置的边界跨越到另一个边界,
aptre重写为@go/...导入. - 在当前模块外解析的导入仍然重写到
@go/...从vendor/和以前一样.
鉴于:
{
"aptre": {
"tsImportBoundaries": ["bldr", "db"]
}
}
如:
import { VolumeInfo } from '../../db/volume/volume.pb.js'
内 bldr/plugin/plugin.pb.ts 改为:
import { VolumeInfo } from '@go/github.com/yourorg/yourrepo/db/volume/volume.pb.js'
边界条目与 Go 模块根的路径相匹配, 所以
它们应该命名 repo 目录, 如 bldr, (中文(简体) ), db,或 net未满
模块路径.
相关项目
- 星点 – 为 Go, TypeScript 和 Rust 流出 RPC
- (原始内容存档于2019-09-31) (英语). protobuf-go-lite 轻型 不反射去原地取出
- (原始内容存档于2018-10-21) (英语). protobuf-es-lite ——轻量级 TypeScript protobuf
- 去 - protoc -wasi (英语) - 嵌入原型为WASM
- 去 - protoc - gen - pros ——作为 WASM 的 prost 插件
- 模板 — 使用此软件包的项目模板
- 原生项目 - 更广泛的实例
支助
请打开一个 GitHub 问题 有问题或问题.
许可证
麻省理工学院