rustnetconf_yang这个crate会从 $CARGO_MANIFEST_DIR/yang-models生成Rust源代码文件,而不是从my_project/yang-models生成。怎么修改?
我需要检查从YANG文件生成Rust源文件的过程,是否按我们预期的方式工作。
根据下方的 crate information ,我需要把我的YANG文件放入一个 yang-models 目录中,cargo build 将处理生成,前提是 rustnetconf_yang 是该项目的依赖:
rustnetconf-yang
YANG模型代码生成用于rustnetconf。它会从YANG模型生成带类型的Rust结构体,从而在编译时验证你的网络配置。
工作原理
- 将
.yang模型文件放在你项目的yang-models/目录中- 将
rustnetconf-yang作为依赖添加- 运行
cargo build—— 构建脚本会在OUT_DIR生成Rust结构体- 使用生成的类型,配合
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-modelsmyproject/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。