本指南为希望为 Dify 平台做出贡献或扩展 Dify 平台的开发者提供了全面的信息。它涵盖了开发环境设置、架构概述、开发工作流程、测试策略和贡献指南。
有关在生产环境中部署 Dify 的信息,请参阅 部署和配置。有关详细的 API 集成指南,请参阅 API 参考。有关后端或前端的具体开发任务,请参阅 后端开发 和 前端开发。
本开发指南涵盖
Dify 平台支持多种开发环境选项
| 环境 | Python | Node.js | 包管理器 |
|---|---|---|---|
| 本地开发 | 3.11-3.12 | 22.x | uv, pnpm 10.x |
| DevContainer | 3.12 | LTS | uv, pnpm |
| GitHub Codespaces | 3.12 | LTS | uv, pnpm |
推荐的开发方法是使用 VS Code DevContainers 以实现一致的环境
来源: .devcontainer/devcontainer.json .devcontainer/post_create_command.sh .devcontainer/post_start_command.sh
DevContainer 自动设置
uv 包管理器pnpm来源: api/README.md41-64 api/Dockerfile20-22
来源: web/README.md13-47 web/Dockerfile19-25
此图将高级系统组件与其对应的代码实体进行了映射
来源: api/Dockerfile27-28 web/Dockerfile2-3 .devcontainer/devcontainer.json api/README.md7-9
此图展示了开发工具与流程之间的关系
来源: .github/workflows/style.yml48-53 dev/reformat8-12 web/.husky/pre-commit27-44 dev/pytest/pytest_vdb.sh
API 开发遵循以下模式
services/ 目录中,具有专门的服务类controllers/ 中使用 Flask blueprints 定义models/ 目录中使用 SQLAlchemy ORMmigrations/ 中的 Flask-Migrate| 任务 | 命令 | 描述 |
|---|---|---|
| 安装依赖项 | uv sync --dev | 安装所有开发依赖 |
| 运行 API 服务器 | uv run flask run --host 0.0.0.0 --port=5001 --debug | 启动开发服务器 |
| 运行 Worker | uv run celery -A app.celery worker -P gevent -c 1 | 启动后台任务 worker |
| 运行迁移 | uv run flask db upgrade | 应用数据库迁移 |
| 运行测试 | uv run bash dev/pytest/pytest_all_tests.sh | 执行完整的测试套件 |
来源: api/README.md66-78 api/docker/entrypoint.sh30-31
前端使用 Next.js 和 TypeScript
app/components/app/(routes)/| 任务 | 命令 | 描述 |
|---|---|---|
| 安装依赖项 | pnpm install | 安装 Node.js 依赖 |
| 运行开发服务器 | pnpm run dev | 启动开发服务器 |
| 构建生产版本 | pnpm run build | 构建优化的生产 bundle |
| 运行测试 | pnpm run test | 执行 Jest 测试套件 |
| 代码 Lint | pnpm run lint | 运行 ESLint 检查 |
来源: web/README.md15-47 web/next.config.js22-67
项目使用自动代码质量检查
来源: web/.husky/pre-commit14-78
API 测试基础设施非常全面,包含多种测试类型
来源: .github/workflows/api-tests.yml47-61 dev/pytest/pytest_vdb.sh .github/workflows/vdb-tests.yml79-83
测试在隔离的环境中运行,使用 Docker 容器作为中间件服务
| 测试类型 | 依赖项 | 执行命令 |
|---|---|---|
| 单元测试 | 无 | uv run bash dev/pytest/pytest_unit_tests.sh |
| 工作流测试 | 沙箱、SSRF 代理 | uv run bash dev/pytest/pytest_workflow.sh |
| 工具测试 | 沙箱、SSRF 代理 | uv run bash dev/pytest/pytest_tools.sh |
| VDB 测试 | 多个向量数据库 | uv run bash dev/pytest/pytest_vdb.sh |
来源: .github/workflows/api-tests.yml80-94 .github/workflows/vdb-tests.yml62-83
Web 前端使用 Jest 进行单元测试
来源: web/README.md95-108 web/.husky/pre-commit46-78
API 后端使用 ruff 进行代码格式化和 linting
ruff format 自动格式化代码ruff check 进行代码质量检查mypy 进行静态类型分析来源: dev/reformat8-18 .github/workflows/style.yml48-57
Web 前端使用 ESLint 和 TypeScript
来源: web/next.config.js46-55 .github/workflows/style.yml96-102
API 和 Web 组件都使用多阶段 Docker 构建,以优化生产镜像
来源: api/Dockerfile1-80 web/Dockerfile1-77
main 分支创建功能分支dev/reformat 来修复格式问题feature/add-new-model-provider, fix/workflow-execution-bug所有代码更改都经过自动化检查
来源: .github/workflows/style.yml .github/workflows/api-tests.yml .github/workflows/docker-build.yml .github/workflows/db-migration-test.yml
开发需要正确的环境配置
api/.env.example 到 api/.env 并进行配置web/.env.example 到 web/.env.local 并进行配置docker/.env.example 和 docker/middleware.env.exampleSECRET_KEY 值