贡献指南

前置准备

  1. Fork 仓库到个人账号下,克隆到本地:

    git clone https://github.com/<你的用户名>/MindIE-SD.git
    
  2. build_guide.md 完成源码编译。

  3. 安装 lint 依赖和 pre-commit hook:

    pip install -r requirements-lint.txt
    pre-commit install
    

    pre-commit 详细说明见 dev_setup.md 的「Lint 与提交前检查」章节。

编码规范

Ruff 配置

Ruff 配置来自 pyproject.toml[tool.ruff] 段:

配置项 说明
行长度 100 单行最大字符数
Python 版本 py310 目标版本
docstring 格式化 true 格式化 docstring 中的代码块

启用的 Lint 规则组:

规则组 含义
E pycodestyle 错误(空白行、缩进等)
F Pyflakes(未使用导入、未定义名称等)
I isort 导入排序
N pep8-naming 命名规范
W pycodestyle 警告
UP pyupgrade 语法现代化
B flake8-bugbear 常见错误
C4 flake8-comprehensions 推导式优化
SIM flake8-simplify 简化建议
G flake8-logging-format 日志格式

Pre-commit 钩子

pre-commit install 安装的钩子在每次 git commit 时自动运行:

钩子 行为
ruff-check 自动修复 Python lint 问题
ruff-format 自动格式化 Python 代码
pylint Python 代码质量检查
bandit Python 安全漏洞扫描
codespell 注释/文档拼写检查(跳过代码文件)
typos 代码标识符拼写检查
clang-format C++ 代码格式化
markdownlint Markdown 格式检查(手动模式)
trailing-whitespace 删除行尾空白字符
end-of-file-fixer 文件末尾添加换行符
check-yaml YAML 格式检查
check-added-large-files 拦截大于 50MB 文件
check-merge-conflict 检测未解决的合并冲突
detect-private-key 检测硬编码密钥

Python 编码约定

文件头模板:所有 .py 文件必须包含 Mulan PSL v2 许可证头。

导入顺序(Ruff I 规则强制执行):

  1. 标准库(如 contextlib, dataclasses, typing
  2. 第三方库(如 torch
  3. 本地模块(如 from .compiliation_config import ...

每组内部按字母序排列。

空白行:模块级函数/类定义前 2 个空白行,类内方法前 1 个空白行。

引号:统一使用双引号。

类型注解:目标 Python 3.10,可使用 X | Y 联合语法(PEP 604)。函数签名建议包含参数和返回值类型注解。

日志:使用标准 logging 模块,避免在日志字符串中使用 .format() 或 f-string,优先使用 % 风格参数:

logger = logging.getLogger(__name__)
logger.debug("...")
logger.warning("...")

C/C++

使用 clang-format 做代码格式化,配置位于 .clang-format

Markdown

使用 markdownlint 做文档格式检查。手动运行方式见 dev_setup.md

核心规则:

规则 说明
MD040 围栏代码块必须指定语言标记
MD009 禁止行尾空格
MD012 禁止连续多个空白行
MD031 围栏代码块前后需有空行

代码块语言选用:

内容类型 语言标记
Python 代码 python
Shell 命令 bash
目录/文件树 text
终端输出/日志 text

拼写与命名检查

codespell + typos 对代码和文档做拼写检查。

提交前检查

确保所有 pre-commit 检查通过后再提交:

pre-commit run --all-files

如需临时绕过(仅紧急情况):

git commit --no-verify

运行测试

CPU 友好单元测试

bash tests/run_UT_test.sh

NPU 全量测试

bash tests/run_test.sh --all

可选参数:--cpu_only--npu_only

测试详细说明见 test.md

分支与提交规范

  • 分支命名:feat/<功能名>fix/<问题>docs/<主题>refactor/<范围>
  • 提交信息:首行简明(不超过 72 字符),可附带详细说明段落

Pull Request 流程

  1. main 创建新分支。
  2. 完成修改并确保 pre-commit + 测试通过。
  3. 提交 PR,关联 Issue(如有),描述变更内容与动机。
  4. Reviewer 给出技术评审意见。
  5. Approver 确认变更已具备合入条件。
  6. Branch keeper 或授权 maintainer 将变更合入受保护分支。

角色定义和决策流程详见 ../community/governance.md

文档同步要求

  • 用户可见的变更须同步更新 docs/zh/docs/en/ 下的对应文档。
  • 重要变更须更新 release_note.md 的版本说明。
  • 重大接口变更、行为变更应事先提交 RFC。

新手上路

新手可从浏览仓库中所有开放的 Issue 开始,选择与自己能力匹配的任务。阅读 repo_structure.md 了解代码布局,有助于快速上手。

编码注意事项

  • 避免重复代码,超过 5 行的重复片段应提取为公共函数。
  • 减少 NPU-CPU 同步操作(如 .item().cpu()),优先向量化。
  • 模型前向中的运行时检查应缓存为成员变量,避免每层重复计算。
  • 纯函数优先,避免对参数原地修改。
  • 单文件超过 2000 行时应拆分。
  • 工具类函数放在文件底部,核心数据结构放在顶部。
  • 禁止使用 pickle.loads() / pickle.load() 反序列化不可信数据。
  • 新增功能或适配新硬件时,尽量不改造现有代码,优先创建新文件引入独立模块。
  • 多分支判断时,确保默认路径/公共路径作为第一个分支。