Registry Bootstrap¶
Registry bootstrap 是一个针对环境的显式导入契约。它由
ADR-0004 Registry Bootstrap Contract 定义,并在
src/unilab/base/registry.py 中实现。
运行时流程¶
训练入口调用
unilab.training.common.ensure_registries()。该 helper 委托给
unilab.base.registry.ensure_registries()。registry 依次从三个来源收集 bootstrap 包:内置的
unilab.tasks、第三方包 通过[project.entry-points."unilab.tasks"]声明的 entry point(值为可导入 包名)、以及UNILAB_EXTRA_REGISTRY_PACKAGES环境变量(主要供测试 fixture 使用)。每个 bootstrap 包暴露
__unilab_registry_modules__,即一个包含注册副作用的 task leaf module 显式元组。被导入的模块通过
@registry.envcfg(...)注册 config,并通过@registry.env(..., sim_backend=...)或registry.register_env(...)注册 env 实现。运行时构造经由
registry.make(...),它会应用 env config override、校验 env config、选择所请求的 backend,并实例化已注册的 env 类。
扩展规则¶
如果新的 task leaf 尚未被现有 bootstrap 条目导入,需将其加入
unilab.tasks.__unilab_registry_modules__。仓库外的第三方任务包在自己的
pyproject.toml中声明[project.entry-points."unilab.tasks"](例如microduck = "microduck_rl_unilab.tasks")完成自注册,被声明的包同样暴露__unilab_registry_modules__。entry-point 元数据位于 site-packages 中, spawn 出的 collector 子进程无需转发环境变量即可发现同样的包;entry-point 包的导入失败按 fail-closed 处理(安装是显式行为)。UNILAB_EXTRA_REGISTRY_PACKAGES环境变量仍保留,供测试 fixture 与临时 调试使用。保持注册过程轻量。场景 materialization、XML 处理、资源访问以及 backend 构造 应放在
registry.make(...)之后,而不是放在装饰器注册中。重复的 env config 以及重复的
(env, sim_backend)注册会在src/unilab/base/registry.py中抛出ValueError;请保留该失败边界。
仓库中的证据¶
Bootstrap helper:
src/unilab/base/registry.py训练 helper:
src/unilab/training/common.pyTask bootstrap 声明:
src/unilab/tasks/__init__.py测试:
tests/base/test_registry.py、tests/utils/test_algo_utils.py