代码质量与风格检查
代码质量与代码检查
相关源文件
本章引用的主要源码文件:
.github/actions/setup-web/action.yml.github/labeler.yml.github/workflows/api-tests.yml.github/workflows/autofix.yml.github/workflows/build-push.yml.github/workflows/db-migration-test.yml.github/workflows/docker-build.yml.github/workflows/main-ci.yml.github/workflows/pyrefly-diff-comment.yml.github/workflows/pyrefly-diff.yml.github/workflows/style.yml.github/workflows/tool-test-sdks.yaml.github/workflows/translate-i18n-claude.yml.github/workflows/trigger-i18n-sync.yml.github/workflows/vdb-tests-full.yml.github/workflows/vdb-tests.yml.github/workflows/web-tests.ymlapi/.ruff.tomlapi/controllers/inner_api/plugin/wraps.pyapi/core/tools/utils/parser.pyapi/libs/broadcast_channel/channel.pyapi/libs/broadcast_channel/exc.pyapi/libs/broadcast_channel/redis/streams_channel.pyapi/services/datasource_provider_service.pyapi/services/rag_pipeline/rag_pipeline_manage_service.pyapi/tests/test_containers_integration_tests/libs/broadcast_channel/redis/test_streams_channel.pyapi/tests/unit_tests/controllers/inner_api/plugin/test_plugin_wraps.pyapi/tests/unit_tests/controllers/inner_api/test_auth_wraps.pyapi/tests/unit_tests/controllers/inner_api/workspace/test_workspace.pyapi/tests/unit_tests/controllers/web/test_human_input_form.pyapi/tests/unit_tests/core/tools/utils/__init__.pyapi/tests/unit_tests/core/tools/utils/test_parser.pyapi/tests/unit_tests/core/trigger/debug/test_debug_event_selectors.pyapi/tests/unit_tests/libs/broadcast_channel/redis/test_streams_channel_unit_tests.pyapi/tests/unit_tests/services/test_app_generate_service_streaming_integration.pyapi/tests/unit_tests/services/test_datasource_provider_service.pydepot.jsonpackage.jsonpackages/dify-ui/README.mdpackages/dify-ui/src/dialog/index.tsxpackages/dify-ui/src/toast/__tests__/index.spec.tsxpackages/dify-ui/vite.config.tspackages/dify-ui/vitest.setup.tspnpm-lock.yamlpnpm-workspace.yamlsdks/nodejs-client/tsconfig.jsonsdks/nodejs-client/vite.config.tsvite.config.tsweb/app/components/base/form/index.stories.tsxweb/app/components/header/account-setting/members-page/edit-workspace-modal/__tests__/index.spec.tsxweb/contract/router.tsweb/eslint.config.mjsweb/eslint.constants.mjsweb/knip.config.tsweb/vite.config.ts
本文档描述了 Dify 代码库中使用的代码质量强制和代码检查基础设施。它涵盖了静态分析工具、格式化工具、类型检查器和自动修复系统,这些工具用于维护代码一致性并在运行时之前捕获错误。
有关测试基础设施和测试执行的信息,请参阅测试基础设施与策略。有关持续集成(CI)管线架构和工作流编排,请参阅持续集成(CI)管线架构。
概述与工具生态
Dify 项目采用多层代码质量策略,针对 Python 后端代码、TypeScript 前端代码和基础设施文件使用不同的工具。所有质量检查都通过 GitHub Actions 工作流强制执行,这些工作流在拉取请求和推送到主分支时运行。
代码质量工具矩阵
| 语言/文件类型 | 代码检查工具 | 格式化工具 | 类型检查器 | 死代码检测器 | 导入验证器 |
|---|---|---|---|---|---|
| Python | Ruff / Import Linter | Ruff | mypy / pyright | - | Import Linter |
| TypeScript/JavaScript | ESLint | ESLint (--fix) | tsc | knip | tsslint |
| Shell 脚本 | ShellCheck | - | - | - | - |
| YAML | yamllint | - | - | - | - |
| Dockerfile | Hadolint | - | - | - | - |
| Editorconfig | editorconfig-checker | - | - | - | - |
| Dotenv | dotenv-linter | - | - | - | - |
来源: .github/workflows/style.yml:15-173
持续集成/持续部署(CI/CD)集成架构
代码风格检查工作流架构
代码风格检查工作流使用 tj-actions/changed-files 进行基于路径的过滤,以有条件地执行检查。通过仅对后端(api/)或前端(web/)源代码树中已变更的文件运行相关检查,优化了持续集成(CI)运行时间。例如,Python 代码检查和导入验证仅在 api/ 下的文件发生变更时运行,而 ESLint 和 TypeScript 检查则在 web/ 目录或相关 SDK 发生变更时执行。
super-linter 的调用范围更广,用于覆盖各种基础设施文件,如 Shell 脚本、YAML、Dockerfile 和 editorconfig 文件,以验证主应用程序代码之外的格式和约定。
来源: .github/workflows/style.yml:15-173
Python 代码质量工具
Ruff:快速的 Python 代码检查器和格式化工具
Ruff 是 api/ 目录下所有 Python 代码的主要代码检查和格式化工具。它强制执行代码风格、检测错误,并对常见问题应用自动修复。
autofix.ci GitHub 工作流被配置为针对每个针对主分支的拉取请求,分多个阶段运行 Ruff:
- 首先格式化代码以修复基本风格问题(
ruff format ..) - 使用
--fix参数运行代码检查,以自动处理违规问题 - 重新运行格式化以确保输出的一致性
此序列为整个仓库提供了确定性的、干净的 Python 代码,减少了代码评审中的摩擦。
自动修复工作流中的 Ruff 执行管线
来源: .github/workflows/autofix.yml:68-78
Mypy 与类型检查
静态类型分析可以防止类型相关的错误并提高代码清晰度。Python 类型检查通过以下命令在持续集成(CI)中运行:
make type-check-core
当 API Python 源文件发生变更时,会调用此目标,并使用 mypy 或兼容系统确保所有类型注解的正确实现。
Python 类型检查流程
来源: .github/workflows/style.yml:50-52
导入检查工具
为了强制执行架构边界并检测不恰当的依赖关系,一个导入检查工具会验证内部包之间的导入。
导入检查工具在 API 构建中配置,并通过以下命令调用:
uv run --directory api --dev lint-imports
它会检查代码导入是否符合允许的导入图,并防止意外的循环或跨层依赖违规。
来源: .github/workflows/style.yml:46-48
TypeScript/JavaScript 代码质量工具
ESLint:Web 前端代码检查
ESLint 被配置为 web/ 目录下前端 TypeScript 和 JavaScript 文件的主要代码检查工具。它使用一个扩展了 @antfu/eslint-config 的自定义配置,强制执行编码标准、风格和最佳实践。
关键规则和插件
- React/Next.js 规则:强制执行 React 最佳实践,例如禁止不必要的
use前缀和在副作用中设置状态。定义了受限的导入路径,以防止在不当的上下文中导入特定平台的代码。 - Tailwind CSS 代码检查:通过
eslint-plugin-better-tailwindcss验证类名排序、防止重复,并对未知类名发出警告。 - 国际化(i18n):自定义规则和插件强制执行翻译键的一致性,防止多余的键,并确保占位符的一致性。
- 桶文件限制:
eslint-plugin-no-barrel-files禁止某些路径使用桶文件,以避免性能和摇树优化问题。
此配置对于前端代码质量至关重要,并已集成到持续集成(CI)中,并带有缓存。
来源: web/eslint.config.mjs:1-192
ESLint 抑制
为了管理遗留代码的抑制,一个 eslint-suppressions.json 文件会跟踪每个文件中允许的规则违规及其数量。这允许采用渐进式改进策略,在修复现有违规之前阻止新的违规。
来源: eslint-suppressions.json:1-280
自动修复系统
autofix.ci 工作流自动化了后端和前端的结构性代码转换和格式化修复。
结构性代码重写(AST-Grep)
对于后端 Python 代码的现代化改造,特别是迁移到 SQLAlchemy 2.0 API,Dify 使用 ast-grep 进行基于 AST 的自动化重写。它执行以下操作:
| 操作 | 模式 | 重写 |
|---|---|---|
| 查询过滤器 | db.session.query($W).filter($H) | db.session.query($W).where($H) |
| 模型列 | $A = db.Column($$$B) | $A = mapped_column($$$B) |
| 可选类型 | Optional[T] | T | None |
该工作流包含一个自定义的 sed 后处理步骤,用于修正 Python 在联合形式中尚不支持的前向引用。
Web 自动修复
前端自动修复使用带有 --fix 标志的 ESLint,并修剪不必要的抑制,以自动保持代码整洁。
来源: .github/workflows/autofix.yml:85-126
基础设施验证(超级代码检查工具)
超级代码检查工具验证仓库中的各种基础设施代码和配置文件:
- Hadolint:用于 Dockerfiles
- ShellCheck:用于 Shell 脚本
- YAMLLint:用于 YAML 文件
- EditorConfig 检查器:用于 editorconfig 合规性
这些检查会在任何影响配置和基础设施文件的推送或拉取请求上运行。
超级代码检查工具验证逻辑
来源: .github/workflows/style.yml:131-173
关键质量命令摘要
| 上下文 | 命令 | 描述 |
|---|---|---|
| API | uv run ruff check --fix . | Python 代码检查和自动修复 |
| API | uv run ruff format .. | Python 代码格式化 |
| API | make type-check-core | 静态类型检查(mypy) |
| API | uv run --directory api --dev lint-imports | 导入依赖验证 |
| Web | vp run lint:ci | 前端 ESLint 代码检查 |
| Web | vp run type-check | TypeScript 类型检查 |
| Web | vp run knip | 死代码检测 |
| 基础设施 | uv run dotenv-linter ./api/.env.example ./web/.env.example | Dotenv 配置文件验证器 |
来源: .github/workflows/style.yml:42-123, .github/workflows/autofix.yml:68-123
将自然语言工具桥接到代码实体
图 1:Dify 中的 Python 代码质量工具
这说明了 Python 后端代码质量工具是如何在检测到 API 源代码变更后,由持续集成(CI)触发并串联执行的。
图 2:Dify 中的前端代码检查和类型检查
这描述了在检测到任何 Web 或 SDK 文件变更时触发的前端代码检查和类型检查管线。
这种分层且集成的代码质量方法,通过利用嵌入在持续集成(CI)管线中的自动化检查,确保了 Dify 代码库维持高标准、减少错误并提高可维护性。
来源:
.github/workflows/style.yml:15-173.github/workflows/autofix.yml:68-126web/eslint.config.mjs:1-192.github/workflows/pyrefly-diff.yml(未完整展示,但与代码重写相关)