#flat-buffers #build-script #codegen

flatbuffers-build

一个帮助从Rust生成flatbuffer代码的库

2个不稳定版本

0.2.0+flatc-24.3.252024年5月20日
0.1.2+flatc-23.5.262024年3月31日
0.1.1+flatc-23.5.26 2024年3月31日
0.1.0+flatc-23.5.26 2024年3月31日
0.0.0+flatc-23.5.26 2024年3月31日

#566 in 编码

MIT许可证

25KB
280

flatbuffers-build

Crates.io docs.rs Github Workflow MIT

此crate提供了一套函数,以方便在Rust中从Rust编译flatbuffer。这对于在build.rs脚本中使用尤其有帮助。请注意,为了兼容性,此crate将仅支持flatc编译器的单个版本。请检查它是否与您系统上安装的版本匹配。话虽如此,由于flatbuffers的版本策略,混合补丁和甚至次要版本可能是可以的。

用法

如果您不确定从哪里开始,请查看仓库中的flatbuffers-example文件夹以获取示例。然而,我们将在这里解释全部功能。

例如,想象一个具有以下文件夹结构的crate

├── build.rs
├── Cargo.toml
├── schemas
   ├── example.fbs
   └── weapon.fbs
└── src
    └── main.rs

为了编译和使用从example.fbsweapon.fbs生成的代码,首先您需要将flatbuffers-build添加到您的构建依赖项中,以及匹配的flatbuffers版本

# Cargo.toml
# [...]
[dependencies]
flatbuffers = "=24.3.25"

[build-dependencies]
flatbuffers-build = "=0.1.0"
# [...]

然后您可以将一个非常简单的build.rs编写如下

use flatbuffers_build::BuilderOptions;

BuilderOptions::new_with_files(["schemas/weapon.fbs", "schemas/example.fbs"])
    .set_symlink_directory("src/gen_flatbuffers")
    .compile()
    .expect("flatbuffer compilation failed");

请注意,这里weapon.fbsexample.fbs是基于flatbuffers提供的示例方案。命名空间为MyGame.Sample,其中包含多个表和结构体,包括一个Monster表。

这将只编译flatbuffer,并将它们放入${OUT_DIR}/flatbuffers,并在src/gen_flatbuffers下创建一个符号链接。然后您可以在lib.rs中这样使用它们

#[allow(warnings)]
mod gen_flatbuffers;

use gen_flatbuffers::my_game::sample::Monster;

fn some_fn() {
    // Make use of `Monster`
}

请注意,由于这将生成src/gen_flatbuffers下的符号链接,您需要将其添加到您的gitignore中,因为这个符号链接会在运行时动态更改。

关于文件排序

不幸的是,由于flatc编译器的一个小瑕疵,您提供的fbs文件的顺序确实很重要。通过一些实验,建议您始终在依赖项之后列出文件。否则,生成的mod.rs文件将无法使用。例如,我们有一个weapon.fbs和一个example.fbs文件。由于后者包含对weapon.fbsinclude指令,它应该在列表中放在后面。如果您将example.fbs放在weapon.fbs之前,您将只能导入weapon.fbs的内容,并且如果尝试使用其他组件,将会出现编译错误。

依赖项

~0.3–2.1MB
~37K SLoC