ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Lynx 引擎生成产物的构建边界:读懂 core/build 目录的 AGENTS 契约与错误码生成管线

Lynx 引擎生成产物的构建边界:读懂 core/build 目录的 AGENTS 契约与错误码生成管线 Lynx 引擎生成产物的构建边界读懂 core/build 目录的 AGENTS 契约与错误码生成管线【免费下载链接】lynxEmpower the Web community and invite more to build across platforms.项目地址: https://gitcode.com/GitHub_Trending/lynx10/lynx本文以 Lynx 仓库 core/build/AGENTS.md 为骨架系统讲解这个生成型构建支撑层的职责边界core/build只负责把错误码工具链生成的 C 源码打包成build目标供下游消费真正的错误码定义与生成规则在上游 tools/error_code 工具链中。读完本文你将能判断一个错误码相关改动应该落在生成器还是构建层、如何运行gen_error_code.py重新生成各语言产物并理解本地构建成功但符号消失这类典型回归的成因与验证路径。一、目录定位一个极小的生成产物构建层core/build/AGENTS.md 开宗明义地给出了该目录的 Scope作用域This directory is a very small build-support layer for generated core build artifacts. Today it mainly exposes generated sub-error-code sources through thebuildtarget.翻译过来即core/build是一个面向已生成的核心构建产物的极小构建支撑层当前职责是通过build目标暴露生成的**子错误码sub-error-code**源码。这个目录里只有两个文件core/build/AGENTS.md给协作者含 AI Agent的边界契约core/build/BUILD.gn唯一的有意义的归属文件AGENTS.md 称之为the only meaningful ownership file here。其全部构建内容如下import(../Lynx.gni) lynx_core_source_set(build) { sources [ gen/lynx_sub_error_code.cc, gen/lynx_sub_error_code.h, ] }从源码结构看gen/目录下的lynx_sub_error_code.cc/lynx_sub_error_code.h并不在仓库工作区中提交当前工作区core/build下只有AGENTS.md与BUILD.gn它们是由错误码工具链在本地构建前生成的下游产物。这正是 AGENTS.md 反复强调的第一条边界BUILD.gn只是生成构建产物的目标接线target wiring不是引擎行为engine behavior的落点流经此目标的生成子错误码源码是下游产物downstream artifacts——If their contents are wrong, the source definition or generator is usually the real owner.如果内容错了真正的 owner 通常是上游的定义源或生成器。这一判断可以直接在生成器源码中得到印证。tools/error_code/generator/native/native_generator.py 中BASE_RELATIVE_PATH core/build/gen/ class NativeGenerator(PlatformGenerator): def __init__(self, meta_data_list): super().__init__() file_name to_lower_snake(SUB_ERR_CLASS_NAME) self._register_child_generator( NativeSubCodeHeaderFileGenerator( BASE_RELATIVE_PATH, {0}{1}.format(file_name, HEADER_FILE_EXT), meta_data_list)) self._register_child_generator( NativeSubCodeSrcGenerator( BASE_RELATIVE_PATH, {0}{1}.format(file_name, SOURCE_FILE_EXT), meta_data_list))常量SUB_ERR_CLASS_NAME LynxSubErrorCode定义于 tools/error_code/common.py经to_lower_snake转换后恰好得到lynx_sub_error_code与BUILD.gn中引用的gen/lynx_sub_error_code.cc/.h一一对应。也就是说core/build/BUILD.gn里的两个源文件路径是 native 错误码生成器的硬编码输出目标。下游如何消费 build 目标build目标并非孤立项。在仓库中多个核心目标把它列为依赖例如core/BUILD.gnbuild:buildcore/base/BUILD.gnpublic_deps [ ../build:build ]core/list/BUILD.gn../build:buildcore/runtime/common/BUILD.gndeps [ ../../build:build ]。这解释了为什么 AGENTS.md 在典型回归症状里要警告一次只影响构建的编辑可能看似修好了一个消费者却悄悄断开了另一个共享该生成产物的消费者——因为core/base、core/list、core/runtime/common等多个目标共享同一份生成头文件。二、变更模式的决策树改这里还是去上游core/build/AGENTS.md 的 Typical Change Patterns 给出了一条非常实用的决策规则你的改动意图正确落点只是把生成的源码暴露、接线给消费方目标core/build本目录是对的要修改错误码的定义、命名或生成方式停在这里去检查上游生成器或定义源而不是打补丁修生成层对应到仓库中上游具体指定义源tools/error_code/error_code.yaml——所有 section / behavior / 子错误码与元数据的唯一 YAML 定义生成器tools/error_code/gen_error_code.py 入口脚本以及 tools/error_code/generator 下按平台拆分的生成器。生成入口先校验再生成tools/error_code/gen_error_code.py 的主流程只有四步parser.add_argument(-l, --lang, nargs, helpThe language of generated error code file.) args, unknown parser.parse_known_args() current_path os.path.dirname(os.path.abspath(__file__)) with open(os.path.join(current_path, error_code.yaml), r) as f: spec yaml.safe_load(f) spec_checker SpecChecker(spec) if not spec_checker.check(): print(Error code spec check failed) sys.exit(1) generator ErrorCodeGenerator(spec, args.lang) generator.generate()两个值得注意的机制Spec 先行校验生成前会先用 tools/error_code/checker/spec_checker.py 的SpecChecker校验 YAML 规范校验失败直接退出保证定义错了不会把坏产物写进core/build/gen/按语言选择性生成ErrorCodeGenerator根据--lang参数注册对应的平台生成器不传参时默认生成全部五种语言见 tools/error_code/generator/code_generator.pyclass ErrorCodeGenerator: def __init__(self, spec, lang): if lang None: lang [LANG_TS, LANG_OC, LANG_CPP, LANG_JAVA, LANG_ETS] ...其中语言常量定义在 tools/error_code/common.pyjava、cpp、ts、oc、ets后者对应 Harmony 平台。因此重新生成 C即本文主角的core/build/gen/产物的命令是python tools/error_code/gen_error_code.py -l cpp生成全部语言则不带参数直接运行python tools/error_code/gen_error_code.py。生成器框架回调式遍历tools/error_code/README.md 用一张类图描述了生成脚本的基类继承关系BaseGenerator向下派生出ModuleGenerator与GeneratorGroup再分别细化为BehaviorGenerator、MetaDataEnumGenerator、SubErrorGenerator而GeneratorGroup又派生出FileGenerator与PlatformGenerator。这些基类实现了 tools/error_code/generator/base_generator.py 中定义的一组遍历回调before_generate/after_generatebefore_gen_section/before_gen_behavior/after_gen_behavioron_next_sub_codeon_next_meta_data驱动这些回调的是ErrorCodeGenerator.generate()中的两阶段遍历先遍历元数据列表再遍历 sections → behaviors → codes 三层结构见 tools/error_code/generator/code_generator.py。此外FileGenerator.write()tools/error_code/generator/base_generator.py做了幂等保护新内容与磁盘上已有文件一致时打印generate file (unchanged): ...并跳过写入。这意味着重复运行生成脚本不会产生无意义的文件变更对 CI 与本地 diff 都更友好。错误码的三层编号模型要理解生成产物为什么长成现在这样需要看 YAML 的三层结构详见 tools/error_code/README.md 与 tools/error_code/error_code.yamlSectionhigh-code一级分类如Success0、AppBundle1、BTS2等Behaviormid-code行为分类如 AppBundle 下的Loadmid-code 2、Reload5、Verify7Sub error codelow-code具体错误码如Load下的RenderFailed1、EnvNotReady2、BadResponse3、ParseFailed4、BadBundle5、Exception99。三层编号的组装公式在 tools/error_code/generator/base_generator.py 中def get_sub_code(self, code, behavior, section): return code[KEY_LOW_CODE] behavior[KEY_MID_CODE] * 100 section[KEY_HIGH_CODE] * 10000即最终数值 low-code mid-code × 100 high-code × 10000。以AppBundle.Load.RenderFailed为例1 2×100 1×10000 10201。编号规则新增编号必须大于同层前一个、且不超过两位保证了数值空间内不冲突。元数据继承链YAML 顶部的metadata字段声明了可挂在错误码上的元数据如Level、FixSuggestion、Consumer取值解析遵循子错误码 behavior 默认值的三级继承实现于 tools/error_code/common.pydef meta_data_value_for_sub_code(meta_data, code, behavior): data_keyword meta_data[KEY_KEYWORD] data_value code.get(data_keyword) if data_value None: data_value behavior.get(data_keyword) if data_value None: data_value meta_data[KEY_DEFAULT] return data_value这与 tools/error_code/README.md 中的例子一致behavior 的level为error其下子错误码显式写了level: warn则最终取warn子错误码未指定时回落到 behavior两者都未指定时取meta-data声明的default。tools/error_code/error_code.yaml 开头即为真实样例Level枚举取值fatal / error / warn / undecided、默认errorConsumer为多选枚举取值front-end / client / lynx。三、编辑规则把生成层纪律内化为习惯AGENTS.md 的 Edit Rules 可以归纳为三条可操作的纪律把本目录的文件视为生成或贴近生成的构建产物而不是手工编写的业务逻辑如果改动的本质是错误码定义或生成规则owner 是上游生成器或定义源编辑应发生在那里不要往这个目录引入无关的核心逻辑——它是接线层不是实现层。第 2、3 条背后是明确的所有权划分error_code.yaml (定义) → gen_error_code.py generator/* (生成) → core/build/gen/* (产物) → build 目标 (接线) → 下游目标 (消费) ↑ 改定义来这里 ↑ 改规则来这里 ↑ 只在这里接线一个符合本文边界的典型小改动示例当上游新增了一个错误码 sectionnative 生成器输出文件随之变化但文件名不变时core/build/BUILD.gn完全不需要改动——这正是correct change here is usually small的体现若文件名变化则只需更新sources列表仍然属于 AGENTS.md 允许的暴露/接线生成源码范畴。四、常见回归症状与验证方式两类典型回归core/build/AGENTS.md 列出了两种值得警惕的回归症状本地构建接线成功但生成错误码符号从下游目标中消失。常见诱因是本地core/build/gen/下残留的旧文件与新BUILD.gn引用的文件名不一致或生成脚本未被重新执行导致gen/为空/过期一次只影响构建的编辑看似修好了一个消费者却悄悄断开了另一个共享该生成产物的消费者。如前所述core/base、core/list、core/runtime/common等多个目标都依赖../build:build改动接线时必须在所有消费者路径上确认而不是只在触发报错的那一条链路上验证。从源码结构看第 2 类风险还有一个细节来源FileGenerator.write()通过os.path.join(current_path, ../../../)从生成器脚本位置反推仓库根目录来落盘tools/error_code/generator/base_generator.py产物始终写到core/build/gen/。如果有人在别处复制了一份旧的lynx_sub_error_code.h并手工修复它不会进入构建路径反而会在下次生成时与真实产物产生认知分歧——这也是 AGENTS.md 建议大改动即是 ownership 错位信号的原因。验证路径没有独立单测走最近消费方AGENTS.md 的 Validate 一节明确This directory does not define a standalone unit-test exec. Validate through the nearest consumer build path if you change generated artifact wiring.即该目录不定义独立的单测执行目标改动生成产物接线后应通过最近的消费者构建路径来验证。落到操作上就是运行python tools/error_code/gen_error_code.py -l cpp确认gen/产物按预期生成或输出 unchanged构建依赖build:build的下游目标例如core/base、core/list、core/runtime/common所在的构建目标确认LynxSubErrorCode相关符号在下游编译单元中可见且无重复定义。生成产物文件头由ALERT_COMMENTDO NOT MODIFY THIS FILE与clang-format off/on包裹tools/error_code/common.py这也是判断某个报错是否该回到上游修的快速线索凡是带该头注释的文件其问题归属都在生成管线而非构建层。五、经验法则小编辑原则与参考资料AGENTS.md 以一条 Notes 收尾也是全篇最凝练的一条经验法则A correct change here is usually small. Large edits in this directory are a signal that the real ownership may be elsewhere.这里正确的改动通常很小。在这个目录里出现大编辑是真实 ownership 在别处的信号。当你准备在core/build里做超出更新 sources 列表量级的修改时应当停下来核对是不是应该去 tools/error_code/error_code.yaml 改定义或者去 tools/error_code/generator 改生成规则延伸阅读边界契约本身core/build/AGENTS.md构建接线core/build/BUILD.gn工具链使用文档含新增 section / behavior / 子错误码 / 元数据的完整操作与 YAML 示例tools/error_code/README.md错误码唯一数据源tools/error_code/error_code.yaml生成入口与语言参数tools/error_code/gen_error_code.py生成器基类框架回调遍历与文件幂等写入tools/error_code/generator/base_generator.py平台生成器注册与默认语言集合tools/error_code/generator/code_generator.pynativeC生成器输出路径tools/error_code/generator/native/native_generator.py规范校验器tools/error_code/checker【免费下载链接】lynxEmpower the Web community and invite more to build across platforms.项目地址: https://gitcode.com/GitHub_Trending/lynx10/lynx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表