#protoc #closures #byte #buffer #protocols #compiler #path

protoc-plugin-by-closure

使用 Google Protocol Buffer 编译器 (protoc) 与您的闭包代码结合使用

4 个版本

0.1.3 2024 年 7 月 4 日
0.1.2 2024 年 7 月 4 日
0.1.1 2024 年 6 月 29 日
0.1.0 2024 年 6 月 29 日

597开发工具 中排名

Download history 112/week @ 2024-06-25 132/week @ 2024-07-02 7/week @ 2024-07-09

每月下载 251

Apache-2.0 协议

18KB
185

这是一个库,可以运行带有您自己的闭包代码的 protoc 命令。当您开发自己的 protoc 编译器插件时,通常需要将您的代码编译为可执行二进制文件,然后自行运行 protoc 命令并传递二进制文件的路径。这个 crate 提供了一个方便的替代方案:您只需要将您的代码作为闭包传递给这个库,然后它将像您的闭包是一个可执行二进制文件一样运行 protoc 命令。

示例

use protoc_plugin_by_closure::Protoc;
use std::time::Duration;

Protoc::new()
    .proto_file("my_protobuf_file.proto")
    .proto_file("my_protobuf_file2.proto")
    .proto_path("path/to/my/input_proto_dir/")
    .out_dir("path/to/my/output_dir/")
    .run(Duration::from_sec(3), |request_bytes| {
        // Your plugin logic here, which takes the CodeGeneratorRequest bytes
        // and returns the Result of CodeGeneratorResponse bytes.
    })
    .unwrap();

// The generated file names depend on your plugin logic and the contents of
// the input proto files, but typically they will be like this:
assert!(std::path::Path("path/to/my/output_dir/my_protobuf_file.rs").exists());
assert!(std::path::Path("path/to/my/output_dir/my_protobuf_file2.rs").exists());

工作原理

这个 crate 使用 ipc-channel crate 在内部插件二进制文件和您的闭包代码之间进行通信。当运行 protoc 命令时,这个 crate 生成一个用于 IPC 通道的一次性密钥,并将其作为 protoc 参数传递给内部插件二进制文件。内部插件二进制文件然后使用密钥创建 IPC 通道,并将整个输入 CodeGeneratorRequest 字节发送回调用进程。生成的 CodeGeneratorResponse 字节以相同的方式发送回内部插件二进制文件,并将这些字节输出到 stdout。

功能

  • on-memory:默认启用。提供 ProtocOnMemory 结构体,使您可以在不接触实际文件系统的情况下运行 protoc 命令。因为此功能使用 tempfile crate,如果不需要它,您可以禁用它。

要求

需要夜间通道。

此crate需要不稳定的(截至2024/06)cargo功能bindeps。此crate包含.cargo/config.toml文件,该文件启用了此功能,因此您通常无需担心,但如果您将此crate作为您Cargo工作区的一部分,则需要手动在您的cargo工作区目录下创建包含以下内容的.cargo/config.toml文件(有关原因请参阅官方文档

[unstable]
bindeps = true

依赖关系

~3–33MB
~483K SLoC