如何合并YANG模块与子模块生成统一树形输出及相关疑问
YANG模块与子模块相关问题解答
1. libyang/yanglint解析子模块报错的解决方法
你遇到的错误Unable to parse submodule, parse the main module instead是因为YANG子模块不能单独解析,它必须依附于所属的主模块。另外你的主模块modA里缺少了对子模块sub1的引用,这会导致工具无法关联两者。
修复步骤:
- 首先修改主模块
modA.yang,添加include sub1;语句,让主模块明确引用子模块:module modA { yang-version 1.1; namespace "http://www.example.com/"; prefix ma; include sub1; // 新增这行 container c { leaf l { type string; } } } - 然后使用yanglint同时加载主模块和子模块,或者直接加载主模块(工具会自动找到关联的子模块,前提是文件在同一目录):
# 方法1:同时指定两个文件 yanglint modA.yang sub1.yang # 方法2:只指定主模块,工具自动加载子模块 yanglint modA.yang
这样就能正常解析合并后的模块了。
2. 使用pyang生成合并树形结构的正确方式
pyang默认不会自动合并主模块和子模块,除非你明确指定所有相关文件,并且主模块已经正确引用子模块。
执行以下命令即可生成合并后的树形结构:
pyang -f tree modA.yang sub1.yang
如果主模块已经添加了include sub1;,也可以只指定主模块:
pyang -f tree modA.yang
这样输出的树形结构就会包含主模块和子模块的所有节点。
3. 子模块重复定义节点未报错的原因
你的预期其实是部分正确的:如果重复定义的节点存在冲突才会报错;但如果是完全一致的空定义,YANG允许这种冗余定义(不违反规范)。
详细解释:
YANG规范中,同一个模块(包括其所有子模块)内的节点定义需要保持一致性:
- 如果子模块里的
container c和主模块里的container c定义完全相同(比如都是空容器),工具会认为是冗余但不冲突的定义,所以不会报错。 - 但如果子模块里的
container c添加了新的子节点,或者修改了原有节点的属性(比如添加mandatory true),这就属于冲突,工具会抛出错误。
如果你想让pyang检测这种冗余定义,可以启用严格模式:
pyang -Werror modA.yang sub1.yang
或者使用更严格的检查参数,强制找出这类冗余问题。
内容的提问来源于stack exchange,提问作者user19937
相关产品推荐
相关产品推荐

