rustnetconf_yang这个crate会从 $CARGO_MANIFEST_DIR/yang-models生成Rust源代码文件,而不是从my_project/yang-models生成。怎么修改?

编程语言 2026-07-09

我需要检查从YANG文件生成Rust源文件的过程,是否按我们预期的方式工作。

根据下方的 crate information ,我需要把我的YANG文件放入一个 yang-models 目录中,cargo build 将处理生成,前提是 rustnetconf_yang 是该项目的依赖:

rustnetconf-yang

YANG模型代码生成用于rustnetconf。它会从YANG模型生成带类型的Rust结构体,从而在编译时验证你的网络配置。

工作原理

  1. .yang 模型文件放在你项目的 yang-models/ 目录中
  2. rustnetconf-yang 作为依赖添加
  3. 运行 cargo build —— 构建脚本会在 OUT_DIR 生成Rust结构体
  4. 使用生成的类型,配合 edit_config_typed()

```rs // Generated from ietf-interfaces.yang: use rustnetconf_yang::ietf_interfaces::Interfaces;

let config = Interfaces { interface: vec![Interface { name: "ge-0/0/0".into(), description: Some("uplink".into()), enabled: Some(true), ..Default::default() }], }; ```

这正是我所做的:

  • 将我的 yang-models 目录放在以下任一位置(其中 yang 的文件用于在其他编程语言中生成源代码):
  • myproject/src/yang-models
  • myproject/yang-models
  • Cargo.toml[dependencies] 部分声明 rustnetconf_yang="0.1.2"

cargo build 期间,我可以看到 Compiling rustnetconf_yang v0.1.2 出现,程序构建正常。但并没有在 target 的子目录中直接生成任何内容。

然而,在对 target/debug/build/rustnetconf-yang-bc90d023 目录下的 output 文件进行搜索后,我发现它似乎是从 CARGO_MANIFEST_DIR 环境变量加载yang-models。

但我关心的是位于我项目中的YANG文件。我该如何在它似乎在 build.rs 中执行的 let yang_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join("yang-models");,按照我希望它收集这些文件的位置来改变?

把那个 yang_dir 设置为:~/myproject/yang-models

这是不是需要在我项目的 Cargo.toml 中处理?还是需要在项目根目录创建一个 build.rs 文件?

解决方案

如何使用这个 rustnetconf_yang crate让它从YANG文件生成Rust文件仍然不清楚,我至今还未成功。

似乎在 $OUT/yang_generated.rs 处输出的内容(其中 $OUT位于项目的 target/debug/build/...,但由 $CARGO_MANIFEST_DIR/yang-models 的YANG文件生成)没有被编译或作为依赖加入到所构建的项目中:我的项目能找到 rustnetconf_yang,但在它的模块中找不到应有的 ietf_interfaces,这与 Doc.rs 的描述不符。

我已经在 rustnetconf 项目中(也是 rustnetconf_yang crate的父项目)提出了一个issue:https://github.com/fastrevmd-lab/rustnetconf/issues/30。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章