# 贡献指南 欢迎为 GFramework 贡献代码!本指南将帮助你了解如何参与项目开发。 ## 概述 GFramework 是一个开源的游戏开发框架,我们欢迎所有形式的贡献: - 报告 Bug 和提出功能建议 - 提交代码修复和新功能 - 改进文档和示例 - 参与讨论和代码审查 ## 行为准则 ### 社区规范 我们致力于为所有贡献者提供友好、安全和包容的环境。参与本项目时,请遵守以下准则: - **尊重他人**:尊重不同的观点和经验 - **建设性沟通**:提供有建设性的反馈,避免人身攻击 - **协作精神**:帮助新贡献者融入社区 - **专业态度**:保持专业和礼貌的交流方式 ### 不可接受的行为 - 使用性别化语言或图像 - 人身攻击或侮辱性评论 - 骚扰行为(公开或私下) - 未经许可发布他人的私人信息 - 其他不道德或不专业的行为 ## 如何贡献 ### 报告问题 发现 Bug 或有功能建议时,请通过 GitHub Issues 提交: 1. **搜索现有 Issue**:避免重复提交 2. **使用清晰的标题**:简洁描述问题 3. **提供详细信息**: - Bug 报告:复现步骤、预期行为、实际行为、环境信息 - 功能建议:使用场景、预期效果、可能的实现方案 **Bug 报告模板**: ```markdown **描述** 简要描述 Bug **复现步骤** 1. 执行操作 A 2. 执行操作 B 3. 观察到错误 **预期行为** 应该发生什么 **实际行为** 实际发生了什么 **环境信息** - GFramework 版本: - .NET 版本: - 操作系统: - Godot 版本(如适用): **附加信息** 日志、截图等 ``` ### 提交 Pull Request #### 基本流程 1. **Fork 仓库**:在 GitHub 上 Fork 本项目 2. **克隆到本地**: ```bash git clone https://github.com/your-username/GFramework.git cd GFramework ``` 3. **创建特性分支**: ```bash git checkout -b feature/your-feature-name # 或 git checkout -b fix/your-bug-fix ``` 4. **进行开发**:编写代码、添加测试、更新文档 5. **提交更改**:遵循提交规范(见下文) 6. **推送分支**: ```bash git push origin feature/your-feature-name ``` 7. **创建 PR**:在 GitHub 上创建 Pull Request #### PR 要求 - **清晰的标题**:简洁描述变更内容 - **详细的描述**: - 变更的背景和动机 - 实现方案说明 - 测试验证结果 - 相关 Issue 链接(如有) - **代码质量**:通过所有 CI 检查 - **测试覆盖**:为新功能添加测试 - **文档更新**:更新相关文档 ### 改进文档 文档改进同样重要: - **修正错误**:拼写、语法、技术错误 - **补充示例**:添加代码示例和使用场景 - **完善说明**:改进不清晰的描述 - **翻译工作**:帮助翻译文档(如需要) 文档位于 `docs/` 目录,使用 Markdown 格式编写。 ## 开发环境设置 当前推荐的项目相关环境、CLI 与 AI 可用工具清单请查看: - [开发环境能力清单](./contributor/development-environment.md) ### 前置要求 - **.NET SDK**:8.0、9.0 或 10.0 - **Git**:版本控制工具 - **IDE**(推荐): - Visual Studio 2022+ - JetBrains Rider - Visual Studio Code + C# Dev Kit ### 克隆仓库 ```bash # 克隆你 Fork 的仓库 git clone https://github.com/your-username/GFramework.git cd GFramework # 添加上游仓库 git remote add upstream https://github.com/GeWuYou/GFramework.git ``` ### 安装依赖 ```bash # 恢复 NuGet 包 dotnet restore # 恢复 .NET 本地工具 dotnet tool restore ``` ### 构建项目 ```bash # 构建所有项目 dotnet build # 构建特定配置 dotnet build -c Release ``` ### 运行测试 ```bash # 运行所有测试 dotnet test # 运行特定测试项目 dotnet test GFramework.Core.Tests dotnet test GFramework.SourceGenerators.Tests # 生成测试覆盖率报告 dotnet test --collect:"XPlat Code Coverage" ``` ### 验证代码质量 项目使用 MegaLinter 进行代码质量检查: ```bash # 本地运行 MegaLinter(需要 Docker) docker run --rm -v $(pwd):/tmp/lint oxsecurity/megalinter:v9 # 或使用 CI 流程验证 git push origin your-branch ``` ## 代码规范 ### 命名规范 遵循 C# 标准命名约定: - **类、接口、方法**:PascalCase ```csharp public class PlayerController { } public interface IEventBus { } public void ProcessInput() { } ``` - **私有字段**:_camelCase(下划线前缀) ```csharp private int _health; private readonly ILogger _logger; ``` - **参数、局部变量**:camelCase ```csharp public void SetHealth(int newHealth) { var oldHealth = _health; _health = newHealth; } ``` - **常量**:PascalCase ```csharp public const int MaxPlayers = 4; private const string DefaultName = "Player"; ``` - **接口**:I 前缀 ```csharp public interface IArchitecture { } public interface ICommand<TInput> { } ``` ### 代码风格 - **缩进**:4 个空格(不使用 Tab) - **大括号**:Allman 风格(独占一行) ```csharp if (condition) { DoSomething(); } ``` - **using 指令**:文件顶部,按字母顺序排列 ```csharp using System; using System.Collections.Generic; using GFramework.Core.Abstractions; ``` - **空行**: - 命名空间后空一行 - 类成员之间空一行 - 逻辑块之间适当空行 - **行长度**:建议不超过 120 字符 ### 注释规范 #### XML 文档注释 所有公共 API 必须包含 XML 文档注释: ```csharp /// <summary> /// 架构基类,提供系统、模型、工具等组件的注册与管理功能。 /// </summary> /// <typeparam name="TModel">模型类型</typeparam> /// <param name="configuration">架构配置</param> /// <returns>注册的模型实例</returns> /// <exception cref="ArgumentNullException">当 model 为 null 时抛出</exception> public TModel RegisterModel<TModel>(TModel model) where TModel : IModel { // 实现代码 } ``` #### 代码注释 - **何时添加注释**: - 复杂的算法逻辑 - 非显而易见的设计决策 - 临时解决方案(使用 TODO 或 HACK 标记) - 性能关键代码的优化说明 - **注释风格**: ```csharp // 单行注释使用双斜杠 // 多行注释可以使用多个单行注释 // 每行都以双斜杠开始 /* 或使用块注释 * 适用于较长的说明 */ ``` - **避免无用注释**: ```csharp // 不好:注释重复代码内容 // 设置健康值为 100 health = 100; // 好:解释为什么这样做 // 初始化时设置满血,避免首次战斗时的边界情况 health = MaxHealth; ``` ### 设计原则 - **SOLID 原则**:遵循面向对象设计原则 - **依赖注入**:优先使用构造函数注入 - **接口隔离**:定义小而专注的接口 - **不可变性**:优先使用 `readonly` 和不可变类型 - **异步编程**:I/O 操作使用 `async`/`await` ## 提交规范 ### Commit 消息格式 使用 Conventional Commits 规范: ``` ():