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 在 开发工具 中排名
每月下载 251 次
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