Files
MediaOrganizer/docs/adr/0021-config-single-source.md
T
Shuery c1ed1795c2
CI / lint + test + build (push) Canceled after 0s
docs: 重写 README、新增项目报告与开发工具配置
- README 现代化重写:徽章区、特性一览、统一 GitHub 提示块格式、修正版本号与 AI 默认值
- 新增 docs/PROJECT_REPORT.md 学术项目报告(含许可证合规分析与死链修复记录)
- 收录 23 份 ADR 架构决策记录与 CONTEXT.md 领域术语表
- 新增开发配置:.editorconfig / .shellcheckrc / .markdownlint-cli2.jsonc
- .gitignore 补充 mo_map/、检查报告、编辑器临时文件
- 新增 config.example.json 配置模板(不含真实密钥)
2026-08-14 22:41:40 +08:00

1.6 KiB

配置单点化(R2):CONFIG_DEFS 单一数据源

每新增一个配置键需要改三处(CONFIG_TEMPLATE 模板 JSON、全局变量声明、load_config 逐键默认值),三处漂移是配置 bug 的常见来源。决定:CONFIG_DEFS(键|默认值数组)成为模板与默认值的单一数据源——render_config_template() 从它生成 config.json 模板(替代 CONFIG_TEMPLATE 常量),load_config 循环加载全部标量键(printf -v 动态赋值 + ${!key:-} 间接引用,零 eval),特殊键在循环后做后处理(FOLDER_* locale 默认、扩展名拆数组、MEDIA_WORKERS/AI_BATCH_SIZE 数值校验、日志目录初始化、命名模板兜底)。

收益:新增纯标量键 = 改 CONFIG_DEFS 一行(模板与默认值自动生效,永不漂移);load_config 手写赋值区净减约 70 行。边界:① 后处理逻辑保留手写(locale/校验/数组是行为逻辑,不适合数据驱动);② printf -v 是 bash 内置(无 eval,配置值不执行);③ NAMING_* 的字面值须与 naming_template_default 保持一致(后者是 render_naming 兜底权威,两处同步修改);④ 白名单键集合(load_config / convert_env_to_json)改经 render_config_template 派生——模板与白名单同源。

Considered Options: 保留三处手写(原状)——新增键易漏一处导致模板与默认值漂移;全部配置改关联数组访问(${CFG[key]})——动所有消费点,破坏 $VAR 直接引用的大量既有代码;CONFIG_DEFS + 循环加载(选定)——单一数据源 + 最小侵入,特殊键后处理保留确定性。