Ray 仓库 Lint 技能指南用 pre-commit 对 Ray 代码完成格式化与质量检查【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址: https://gitcode.com/gh_mirrors/ra/ray本篇指南讲解 Ray 开源仓库GitHub 加速计划 / ra / ray的标准 lint 与格式化工作流如何在改动代码后用 pre-commit 快速检查、如何安装 pre-commit 环境、如何分类处理剩余的静态检查错误以及仓库的排除规则与 CI 层面的完整检查清单。读完本文你将能够像 Ray 开发者一样在提交代码前准确运行 Ray 的 lint 工具链并懂得如何利用# noqa、per-file-ignores与extend-exclude机制解决真实的代码质量问题。核心工作流只对本次修改的文件运行 lintRay 仓库把 lint 与格式化检查统一托管在 pre-commit 中。最常用、也最推荐的做法是只针对你本次修改的文件执行检查而不是对全仓库运行后者耗时且噪音大pre-commit run --files $(git diff --name-only HEAD)这条命令的作用分两步理解git diff --name-only HEAD列出工作区相对最近一次提交HEAD有改动的文件路径只包含已修改但尚未提交的文件pre-commit run --files 文件列表让 pre-commit 仅对传入的这些文件执行匹配的 hooks。这里的要点是不带--files的pre-commit run只处理已 staged暂存区的文件。如果你改完代码后还没有git add直接运行pre-commit run会得到一个“没有文件需要检查”的假象问题会漏到提交或 CI 阶段。所以当你的改动还停留在工作区时必须显式传入修改文件列表。Ray 的这份技能文档特意强调这一点它是日常开发中最容易踩的坑之一。安装 pre-commit 环境如果本机尚未安装 pre-commit按仓库约定的依赖锁定方式安装pip install -c python/requirements_compiled.txt pre-commit pre-commit install-c python/requirements_compiled.txt是约束文件constraints file保证 pre-commit 及依赖版本与 Ray 仓库验证过的版本一致pre-commit install会在.git/hooks/pre-commit安装 git 钩子此后每次git commit都会自动触发配置的检查。仓库官方文档 doc/source/ray-contribute/development.md 的 “Development tooling” 一节也给出了同样的安装方式pip install -c python/requirements_compiled.txt pre-commit pre-commit install并在该节说明若临时不想触发检查可在提交时使用git commit -n等价于--no-verify跳过 hooks。Ray 的检查体系全景.pre-commit-config.yamlRay 仓库根目录的 .pre-commit-config.yaml 是全部 lint/format 检查的唯一配置入口通过多个独立 repo 的 hooks 组合覆盖 Python、C、Java、TypeScript、Bazel、Shell、文档等几乎所有文件类型Hook版本作用范围files 字段用途trailing-whitespace / end-of-file-fixer / check-added-large-files / check-ast / check-json / check-tomlpre-commit-hooks v4.4.0全局含特定 exclude基础文件卫生尾随空白、文件末尾换行、大文件、AST 语法、JSON/TOML 合法ruff默认 --select I两段ruff-pre-commit v0.8.4全局Python lint 自动修复 isort 导入排序pydoclint0.8.3^python/ray/Google 风格 docstring 检查基线见 ci/lint/pydoclint-baseline.txtcpplint2.0.0^src/ray/(gcs/actor\|common/cgroup2\|...)/.*\.(h\|cc)$C 风格检查通过--filter关闭了一部分噪音规则buildifier / buildifier-lint8.0.1BUILD(.bazel)?文件Bazel BUILD 文件格式化与 lintblack22.10.0PythonPython 代码格式化prettierv3.0.3doc/下的 js/ts/tsx/html/css前端与文档代码格式化mypy两组v1.7.0autoscaler 相关文件 serve 白名单静态类型检查pyrefly-servelocal hookpyrefly1.1.1serve 白名单与 mypy 互补的第二套类型检查pygrep-hooksv1.10.0Python/rSTrst 指令、log.warn、mock 方法误用等shellcheckv0.9.0.1ShellShell 脚本检查--exclude1090,1091,2207兼容 macOS 旧 bashclang-formatv12.0.1C/CC 格式化pretty-format-javav2.11.0JavaJava 格式化google-java-formatter 1.7docstylelocal—Python调用 ci/lint/check-docstyle.sh 检查 Ray docstring 风格check-import-orderlocal—Python调用 ci/lint/check_import_order.py按 Ray 自己的 import 顺序规范检查check-cpp-files-inclusionlocal—^src/ray/C检查 C 文件包含合规check-train-circular-importslocal—^python/ray/train/.*\.py$检查 Ray Train 循环导入eslintv8.26.0dashboard client ts/tsx前端代码检查--max-warnings0valev3.17.1^doc/source/data/.*\.(md\|rst)$文档文风检查顶层 exclude哪些目录不做全局检查配置开头用一个大的exclude正则划定了不参与检查的路径包括python/ray/core/generated/、python/ray/serve/generated/、python/ray/cloudpickle/生成的 protobuf 代码与第三方 vendored 代码python/ray/dashboard/client/public/、python/ray/_private/runtime_env/_clonevirtualenv.py构建产物与临时脚本python/ray/data/examples/data/、release/release_logs/、rllib/offline/tests/data数据与日志目录thirdparty/patches/、python/requirements/llm/patches/、src/ray/thirdparty/补丁与第三方源码doc/source/除doc/source/data下的 md/rst 与 BUILD 文件文档 prose 默认不做通用 lint只交给 vale 等专门的 hook。注意 pre-commit 的机制顶层exclude与每个 hook 自身的files/exclude是“与”关系所以像trailing-whitespace这类全局 hook 在doc/source/data上会额外再排除配置注释里解释了原因如果不去掉启用 vale 时会连带重写 17 个无关文件属于刻意保持的配置边界。理解这层机制有助于判断一个文件“没被检查”到底是配置有意为之还是你的改动路径恰好被过滤了。处理剩余的 lint 错误pre-commit 中配置为自动修复的 hooks如 ruff、black、trailing-whitespace会直接改写你的文件。运行后仍报错的基本都是需要人工介入的逻辑性问题常见的几类缺失 import代码用到了某个符号但没有导入需要补import名称冲突局部变量遮蔽了内置名或模块级符号需要重命名或显式引用逻辑结构调整例如复杂条件、不规范的异常处理ruff 的 B 系列规则等需要按提示重构代码。处理原则是直接修改源码本身而不是绕过检查。# noqa的正确用法只有当问题属于“误报且无法通过改代码解决”时才使用# noqa并且必须带上规则代码和理由# noqa: E501 — URL cannot be splitE501是规则码行过长后面跟原因说明理由要真实可查例如“该 URL 无法断行”而不是空白注释滥用# noqa会掩盖真实问题Ray 的 lint 流程在 CI 上使用--show-diff-on-failure任何被掩盖的问题最终都会在审查与测试阶段暴露。排除机制pyproject.toml 中的 per-file-ignores 与 extend-excludeRay 把 Python 相关的豁免集中在 pyproject.toml[tool.ruff]段的extend-exclude列出整棵被跳过的目录/文件例如python/ray/thirdparty_files/、python/ray/_private/thirdparty/、python/build/以及个别故意保留语法错误的测试文件python/ray/serve/tests/test_config_files/syntax_error.py[tool.ruff.lint.per-file-ignores]按文件路径忽略特定规则例如doc/* [I]文档目录跳过 isort 导入排序、python/ray/__init__.py [I]注释里说明这些是“尚未格式化完成、将逐步从黑名单移除”的存量豁免[tool.ruff]同时定义了line-length 88、extend-select [I, B, Q, C4, W]以及一套ignore列表多为从原 flake8 迁移来的规则还有 isort 的section-order与known-third-party等导入排序语义。技能文档给出的处理原则非常清晰当你的 PR 恰好修改了位于这些列表中的文件时应当在你的改动范围内把 lint 问题修干净并考虑把该文件从豁免列表中移除但不要动那些与本次 PR 无关的豁免条目。这样既能逐步收敛存量技术债又不会让一次代码评审背上无关的改动。从本地到 CI完整的 lint 流水线本地 pre-commit 只是第一道关卡。Ray 的 CI 通过 ci/lint/lint.sh 对全仓库运行完整检查脚本中的pre_commit()函数显式列出了约 22 个 hook 并按顺序执行pre-commit run hook --all-files --show-diff-on-failure包括python-no-log-warn、ruff、check-ast、black、prettier、mypy、pyrefly-serve、clang-format、shellcheck、docstyle、check-import-order、check-cpp-files-inclusion、cpplint、buildifier、eslint等pre_commit_pydoclint()单独运行 pydoclintclang_format()和code_format()则分别负责 C 格式与 Shell 脚本格式的检查。这也解释了为什么本地提交前把文件级检查跑通能显著降低 CI 返工率。参考与延伸阅读Hook 配置总入口.pre-commit-config.yamlRuff 与 mypy 的 Python 配置pyproject.toml[tool.ruff]、[tool.mypy]段CI 全量 lint 脚本ci/lint/lint.sh导入顺序检查实现ci/lint/check_import_order.py支持-s/--skip跳过目录CI 中跳过ci、python/ray/thirdparty_files、python/build、libdocstring 基线文件ci/lint/pydoclint-baseline.txt官方开发工具章节doc/source/ray-contribute/development.md“Development tooling”在实际使用中建议把“pre-commit run --files $(git diff --name-only HEAD)”固化成提交前的肌肉记忆先跑文件级检查、再按错误类型分类处理自动修复 → 改源码 → 必要时带理由的# noqa、最后确认没有把无关文件拖进豁免改动——这条工作流既能保证 Ray 代码库的整洁也能让你的每次提交都经得起 CI 的完整检查。【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址: https://gitcode.com/gh_mirrors/ra/ray创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考