You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.1 KiB
5.1 KiB
ADR 009: 资源目录职责分离
状态
✅ 已接受 - 2026-02-02
背景
在项目开发过程中,发现资源目录结构存在以下问题:
-
职责不清:
app/resources/fixtures/定义为"测试数据/初始数据"tests/fixtures/实际存储测试数据- 两者职责重叠,容易混淆
-
文档不一致:
- 文档说明测试数据应在
app/resources/fixtures/ - 实际测试数据在
tests/fixtures/screenplays/
- 文档说明测试数据应在
-
打包问题:
- 测试数据是否应该打包到生产环境?
- 如何区分"种子数据"和"测试数据"?
-
冗余目录:
app/resources/docs/完全为空- FastAPI 已自动生成 API 文档
- 项目文档统一在根目录
docs/
决策
采用明确分离策略,严格区分应用资源和测试数据:
1. 目录职责定义
app/resources/fixtures/ - 应用初始化数据(种子数据)
- 用途:应用启动时加载的种子数据、配置数据
- 示例:AI 模型配置、定价方案、演示项目
- 特点:会被打包到生产环境 Docker 镜像
- 访问:应用代码可访问
scripts/fixtures/ - 调试样本文件
- 用途:手动调试脚本使用的样本文件
- 示例:剧本样本文件(PDF、DOCX、PPTX)
- 特点:不会被打包到生产环境(通过 .dockerignore 排除)
- 访问:仅调试脚本访问
2. 删除冗余目录
删除 app/resources/docs/ 目录,理由:
- FastAPI 自动生成 API 文档(
/docs、/redoc) - 项目文档已在根目录
docs/统一管理 - 当前完全为空,无实际用途
- 符合 YAGNI 原则
3. 最终目录结构
server/
├── app/
│ ├── resources/ # 应用资源(提交 Git,打包到生产)
│ │ ├── templates/ # 邮件/短信模板
│ │ └── fixtures/ # 应用初始化数据(种子数据)
│ ├── uploads/ # 用户上传(不提交 Git)
│ └── storage/ # 本地存储(不提交 Git)
├── scripts/
│ └── fixtures/ # 调试样本(不提交 Git,不打包到生产)
│ └── screenplays/ # 剧本样本文件
└── tests/
├── unit/ # 单元测试
├── integration/ # 集成测试
└── conftest.py # pytest 配置(代码定义的 fixtures)
理由
1. 符合社区惯例
- Python/FastAPI 社区:pytest fixtures 是代码定义的测试辅助函数
- 调试样本隔离:调试样本不应该被应用代码直接访问
- 关注点分离:应用资源、调试样本、测试代码职责清晰
2. 生产环境优化
- 减少镜像体积:调试样本不会被打包到 Docker 镜像
- 安全性:调试样本不会暴露到生产环境
- 性能:减少不必要的文件复制
3. 开发体验
- 清晰的职责划分:开发者一眼就能区分资源类型
- 易于维护:种子数据和调试样本分开管理
- 避免混淆:不会误将调试样本当作种子数据
4. 文档一致性
- 统一文档位置:项目文档在根目录
docs/ - API 文档自动生成:FastAPI 自动生成,无需手动维护
- 减少冗余:删除空目录,保持结构简洁
影响
正面影响
-
职责清晰:
- 种子数据:应用初始化
- 调试样本:手动调试
-
生产优化:
- 镜像体积减小
- 部署速度提升
-
开发效率:
- 目录结构简洁
- 易于理解和维护
负面影响
-
需要更新文档:
- 更新
app/resources/README.md - 更新
RESOURCES.md - 新增
tests/fixtures/README.md
- 更新
-
开发者认知:
- 需要明确告知开发者两者的区别
- 需要在文档中清晰说明
实施步骤
1. 更新文档
- 更新
server/app/resources/README.md - 更新
server/RESOURCES.md - 新增
server/app/resources/fixtures/README.md - 新增
server/scripts/fixtures/README.md - 删除
server/tests/fixtures/目录(未使用)
2. 删除冗余目录
- 删除
server/app/resources/docs/ - 更新相关文档引用
3. 创建 ADR
- 记录架构决策
- 说明选择理由
- 提供迁移指南
替代方案
方案 2:统一到 resources(已拒绝)
将所有测试数据移动到 app/resources/fixtures/
拒绝理由:
- ❌ 测试数据会被打包到生产镜像(增加体积)
- ❌ 违反"测试数据应该在 tests/ 目录"的惯例
- ❌ 应用代码不应该依赖测试数据
参考资料
相关决策
作者: Jointo 开发团队
日期: 2026-02-02
状态: 已接受