Yii 2 贡献者 Git 工作流全指南:从环境搭建到 Pull Request 合并
后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本篇指南面向希望向 Yii 2 框架贡献代码的开发者完整梳理了 Yii 官方维护的 Git 协作流程如何 fork 并搭建本地开发环境、如何配置测试与静态分析工具、如何针对 bug 修复与功能增强创建独立分支、规范地更新 CHANGELOG 并最终提交 Pull Request。读完本文你将掌握一套可直接照做的 11 步贡献流程以及php build/build开发辅助命令的完整用法让代码更快、更顺利地被 Yii 核心团队接受。本文依据仓库中的 docs/internals-ru/git-workflow.md其英文原版为 docs/internals/git-workflow.md整理扩充并结合 build 目录 下的实际源码、phpunit.xml.dist、phpstan.dist.neon、tests/data/config.php 等文件佐证说明。如果你对 Git 与 GitHub 尚不熟悉建议先了解 GitHub 帮助文档、Try Git 教程或 Git 内部数据模型等入门材料再进入本文。一、准备你的开发环境以下步骤用于搭建一套可用于修改 Yii 框架核心代码的本地开发环境。这些步骤只在第一次贡献时需要执行。1. Fork 仓库并克隆到本地在 GitHub 上 fork Yii 2 仓库后将你的 fork 克隆到开发环境中git clone gitgithub.com:YOUR-GITHUB-USERNAME/yii2.git如果在 Linux 上配置 Git 与 GitHub 时遇到问题或出现类似 Permission Denied (publickey) 的错误则需要按 GitHub 官方指引完成 SSH 密钥的配置。如果你对 Git 还不熟练官方推荐的免费《Pro Git》一书是很好的学习资料。2. 将主仓库添加为名为 upstream 的远程仓库进入克隆下来的目录通常名为yii2执行git remote add upstream https://github.com/yiisoft/yii2.git这样你的本地仓库就有两个远程origin你的 fork负责推送与upstream官方主仓库负责同步最新代码。在后续所有工作流步骤中保持origin与upstream分工清晰是基础。3. 准备测试环境如果你只打算参与翻译或文档工作以下步骤可以跳过但如果要修改框架代码则必须完成。安装 PHP 依赖在仓库根目录执行composer install假设你已经全局安装了 Composer。安装 JavaScript 依赖如涉及 JS 工作npm install用于安装 JavaScript 测试工具与依赖假设已安装 Node.js 和 NPM。从当前仓库的 package.json 可以看到JS 测试栈包含 mocha、chai、jsdom、sinon、leche 等测试入口为npm test另提供npm run lint用于 eslint 检查作用于 framework/assets 与 tests/js。注意JavaScript 测试依赖 jsdom 库其要求 Node.js 4 或更新版本官方更推荐 Node.js 6 或 7。克隆基础应用basic模板并建立软链接php build/build dev/app basic这条命令会克隆 basic 应用模板并安装其 composer 依赖。外部第三方包会正常安装到 vendor 目录但Yii 框架本体并不会复制一份而是把当前检出的 yii2 仓库通过软链接指到应用的vendor/yiisoft/yii2从而保证整个开发环境中只存在一份框架代码。如果需要可对 advanced 应用执行同样的操作php build/build dev/app advanced该命令内部执行的是composer update因此也可以用它来更新依赖。注意默认情况下 build 命令通过 SSH 协议克隆 GitHub 仓库如需改用 HTTPS请在 build 命令后追加--useHttp标志。这一步完成后你就拥有了一块可以放心实验 Yii 2 的开发场地。深入源码build/build与DevController做了什么php build/build并非外部工具而是仓库自带的构建脚本见 build/build它开启YII_DEBUG、加载 composer 自动加载器兼容 yii2 作为根包或 yii2-basic/yii2-advanced 作为根包两种场景、加载 framework/Yii.php然后以yii\build\controllers为命名空间启动一个控制台应用。dev/app、dev/ext等子命令由 build/controllers/DevController.php 实现其关键行为包括内置basic、advanced、benchmark三个应用的仓库地址映射以及 apidoc、authclient、bootstrap、redis、mongodb 等二十余个扩展的地址映射dev/app先克隆应用仓库若目录不存在清理其vendor/yiisoft下已存在的软链接执行composer update --prefer-dist最后通过linkFrameworkAndExtensions()将 framework 目录和extensions/下已安装的扩展以符号链接方式挂进应用的 vendor 目录提供--useHttp克隆改用 HTTPS与--composerNoProgresscomposer 追加--no-progress两个选项另有dev/all安装全部应用与扩展与dev/run command在所有应用与扩展目录中批量执行命令例如./build/build dev/run git pull两个辅助动作。也就是说php build/build dev/app basic的链接行为是有明确源码依据的它会删除应用 vendor 目录中的实体目录再以symlink()指向当前开发仓库保证你改动框架代码后应用立即生效无需重新安装。可选运行单元测试在仓库根目录执行phpunit即可运行单元测试。若未全局安装 phpunit可使用php vendor/bin/phpunitWindows 下为vendor/bin/phpunit.bat。仓库根目录的 phpunit.xml.dist 定义了测试套件覆盖整个tests目录、yiiunit\ResultPrinter打印器、以及覆盖率统计的范围与排除项。部分测试需要额外安装并配置数据库。你可以创建tests/data/config.local.php来覆盖 tests/data/config.php 中的默认配置。从该文件源码可见默认配置了 cubrid、mysql、sqlite、sqlsrv、pgsql、oci 共六种数据库的 DSN、账号与 fixture 脚本且会在文件末尾自动 include 同目录下的config.local.php以允许覆盖。例如修改 MySQL 的用户名与密码只需在config.local.php中写入?php $config[databases][mysql][username] yiitest; $config[databases][mysql][password] changeme;你还可以只运行与当前工作相关的测试组。例如只运行验证器与 redis 相关测试phpunit --groupvalidators,redis用phpunit --list-groups可以查看所有可用的测试分组。JavaScript 单元测试则在仓库根目录执行npm test可选静态分析Yii 2 使用 PHPStan 进行静态分析启动命令为php vendor/bin/phpstanWindows 下为vendor\bin\phpstan.bat。默认情况下PHPStan 使用仓库根目录的 phpstan.dist.neon 作为配置——从该文件可见其分析级别为level: 3分析路径覆盖build、framework、tests并排除了tests/data等测试数据目录。你也可以创建自己的phpstan.neonPHPStan 会优先使用它仓库中还提供了 phpstan-baseline.neon 与针对 PHP 7.x 的 phpstan-7x.dist.neon、phpstan-baseline-7x.neon 等配套文件。关于 PHPDoc 注解的约定在 PHPDoc 注释中Yii 使用 PHPStan 类型如果需要为 Psalm 指定不同的类型通常在泛型场景下会发生则应让 Psalm 注解与 PHPStan 注解并存。正确的写法示例如下/** * return Actioncovariant static|null * phpstan-return Actioncovariant static|null * psalm-return Actionself|null */ public function createAction($id) { ... }即同一处返回值分别用return供通用阅读、phpstan-return供 PHPStan 推断与psalm-return供 Psalm 推断三条注解表达保证两个分析器都能得到精确的类型信息。扩展开发要开发某个扩展需要先克隆对应扩展的仓库。仓库提供了一条专用命令php build/build dev/ext extension-name fork其中extension-name是扩展名例如redisfork是你的扩展 fork 地址例如gitgithub.com:my_nickname/yii2-redis.git。如果你是框架核心贡献者可以省略fork参数此时会使用 DevController.php 内置的官方扩展地址如gitgithub.com:yiisoft/yii2-redis.git。如果想把某个扩展放进应用模板中测试只需像平时一样把它加入应用的composer.json例如在 basic 应用的require段添加yiisoft/yii2-redis: ~2.0.0然后重新运行php build/build dev/app basic它会安装该扩展及其依赖并为extensions/redis创建符号链接——这样你直接工作在 yii2 仓库目录内而不是 composer 的 vendor 目录里改动即时生效。注意默认通过 SSH 克隆 GitHub 仓库如需 HTTPS同样追加--useHttp标志。二、修复 bug 与开发新功能的完整流程环境就绪后就可以开始正式的贡献流程了。下面的 11 个步骤是 Yii 官方推荐的协作规范请逐步遵循。1. 确认存在对应的 issue所有新功能与 bug 修复都应关联一个 issue作为讨论与文档记录的唯一参照点。动手前花几分钟在 issue 列表中检索是否有匹配项若已存在对应 issue请在该 issue 下留言说明你打算接手若没有匹配的 issue请新建一个 issue参见 docs/internals-ru/report-an-issue.md如果只是直截了当的小修复也可以直接创建 Pull Request。对于小改动、文档问题或简单修复无需先建 issue直接提交 Pull Request 即可。2. 拉取主仓库的最新代码git pull upstream master每次开始新贡献都应从这一步做起确保你在最新代码上工作。3. 基于最新 master 创建新的特性分支这一步非常重要如果你直接在 master 上开发你将无法从自己的账号提交第二个 Pull Request。每个独立的 bug 修复或改动都应有自己的分支。分支名应具备描述性并以所关联 issue 的编号开头如果没有关联特定 issue可省略编号。例如git checkout upstream/master git checkout -b 999-name-of-your-branch-goes-here4. 写代码做你的魔法确保代码可以工作。单元测试永远受欢迎经过测试、覆盖率良好的代码能极大简化审查工作即使只是描述问题的失败测试也同样被接受。5. 更新 CHANGELOG编辑 CHANGELOG 文件把改动记录插入到文件顶部第一个标题即当前正在开发的版本之下。从 framework/CHANGELOG.md 可以看到实际格式——当前版本标题为2.0.56 under development其下每条记录形如Bug #999: a description of the bug fix (Your Name) Enh #999: a description of the enhancement (Your Name)其中#999是Bug或Enh所对应的 issue 编号。变更记录应按类型Bug、Enh分组并按 issue 编号排序。对于非常小的修复例如拼写错误、文档改动无需更新 CHANGELOG。6. 提交你的更改先把要提交的文件加入暂存区git add path/to/my/file.php也可以使用-p选项交互式挑选要进入本次提交的改动。然后用描述性的提交信息提交。信息中务必包含#XXX编号这样 GitHub 会自动把该提交与对应 issue 关联git commit -m A brief description of this change which fixes #999 goes here7. 再次拉取 upstream 最新代码到你的分支git pull upstream master这确保在提交 Pull Request 之前你的分支包含最新代码。如果出现合并冲突请立即解决并再次提交。这样可以保证 Yii 团队能以一键合并的方式合入你的改动。8. 解决冲突后推送代码到 GitHubgit push -u origin 999-name-of-your-branch-goes-here-u参数会把本地分支与 GitHub 上的分支建立关联之后再次执行git push时 Git 会自动知道推送目标。如果你想后续继续向该 Pull Request 追加提交这会非常方便。9. 向 upstream 发起 Pull Request在 GitHub 上进入你的仓库点击 Pull Request在右侧选择你的分支并在评论框中填写更多信息。要关联 issue请在 Pull Request 描述中任意位置写上#999999 为 issue 编号。注意每个 Pull Request 只应修复单一改动。对于多个互不相关的改动请分别发起多个 Pull Request。10. 等待代码评审会有人评审你的代码并可能要求你做出修改——此时回到第 6 步即可只要当前 Pull Request 仍处于打开状态就无需新开一个。如果代码被接受它会被合并进主分支成为下一个 Yii 版本的一部分如果未被接受也不必气馁——不同的人需要不同的功能Yii 无法满足所有人的全部需求你的代码仍会留在 GitHub 上作为有需要的人的参考。11. 清理代码被接受或拒绝之后可以删除本地仓库与origin上工作过的分支git checkout master git branch -D 999-name-of-your-branch-goes-here git push origin --delete 999-name-of-your-branch-goes-here三、关于 CI 的注意事项为了尽早发现回归每次对 Yii 代码库的合并都会被 CI 系统捕获并自动运行测试。核心团队不希望过度消耗这一服务因此在以下情形中会在合并描述中加入[ci skip]标记以跳过测试运行改动只涉及 JavaScript、CSS 或图片文件仅更新文档改动只涉及固定字符串例如翻译更新。这些改动本质上不涉及单元测试覆盖的范围跳过 CI 可以节省构建资源。在当前仓库中可以结合根目录的 Dockerfile、tests 目录 的测试配置如 phpunit.xml.dist、tests/bootstrap.php理解测试运行的整体依赖。四、命令速查面向进阶贡献者将上述完整流程浓缩为命令序列git clone gitgithub.com:YOUR-GITHUB-USERNAME/yii2.git git remote add upstream https://github.com/yiisoft/yii2.gitgit fetch upstream git checkout upstream/master git checkout -b 999-name-of-your-branch-goes-here /* 写代码如有需要更新 CHANGELOG */ git add path/to/my/file.php git commit -m A brief description of this change which fixes #999 goes here git pull upstream master git push -u origin 999-name-of-your-branch-goes-here再配合环境搭建阶段的composer install、npm install、php build/build dev/app basic以及需要时对 advanced 应用的同样操作、phpunit与php vendor/bin/phpstan你就拥有了一套从搭建、开发、测试、静态分析到提交的完整 Yii 2 贡献闭环。五、小结Yii 2 的贡献流程之所以强调每改动一个独立分支分支名以 issue 编号开头CHANGELOG 分组按编号排序提交信息携带 #XXX本质上是为分布式协作中的讨论、追溯与自动关联提供统一的锚点。这套规范配合仓库自带的build工具链软链接式开发环境与 PHPStan/phpunit 质量门槛让外部贡献者与核心团队之间能够高效、可预期地协作。按照本文的步骤走完一遍你的第一个 Yii 2 Pull Request 就已经在路上了。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐marimo 交互组件指南使用 mo.ui.checkbox 构建响应式勾选开关marimo 交互组件指南使用 mo.ui.checkbox 构建响应式勾选开关 marimo 的 mo.ui.checkbox 是一个布尔型交互组件用于在后端Web框架微信网页版访问终极指南如何用wechat-need-web插件轻松解锁微信网页版微信网页版访问终极指南如何用wechat need web插件轻松解锁微信网页版 还在为微信网页版无法正常登录而烦恼吗您是否经常遇到微信网页版访问受限的困扰后端Web框架Taro 贡献者指南从环境搭建到 Pull Request 全流程实战Taro 贡献者指南从环境搭建到 Pull Request 全流程实战 TaroNervJS/taro是支持 React/Vue/Nerv 等框架、可同时前端小程序跨平台移动开发上一篇天龙八部单机版GM工具5步掌握可视化游戏数据管理下一篇Windows性能调优三层路径AtlasOS驱动级优化完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

RestSharp 拦截器(Interceptor)完整指南:在请求与响应生命周期中嵌入自定义逻辑

RestSharp 拦截器(Interceptor)完整指南:在请求与响应生命周期中嵌入自定义逻辑

RestSharp 拦截器(Interceptor)完整指南:在请求与响应生命周期中嵌入自定义逻辑 【免费下载链接】RestSharp Simple REST and HTTP API Client for .NET 项目地址: https://gitcode.com/gh_mirrors/re/RestSharp 导读 RestSharp 的拦…

2026/9/24 16:45:58 阅读更多 →
Hugging Face Accelerate TPU 训练实战:图编译、权重绑定与 bf16 混合精度配置全解

Hugging Face Accelerate TPU 训练实战:图编译、权重绑定与 bf16 混合精度配置全解

人工智能深度学习分布式训练 【免费下载链接】accelerate 🚀 A simple way to launch, train, and use PyTorch models on almost any device and distributed configuration, automatic mixed precision (including fp8), and easy-to-configure FSDP and DeepSpee…

2026/9/24 16:45:58 阅读更多 →
Apache Arrow C++ Skyhook 扫描示例实战:将过滤与投影下推到 Ceph 集群

Apache Arrow C++ Skyhook 扫描示例实战:将过滤与投影下推到 Ceph 集群

数据工程大数据序列化数据分析 【免费下载链接】arrow Apache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing 项目地址: https://gitcode.com/gh_mirrors/arrow13/arrow 点击查看 免费下载 本文基于 Apache Arrow…

2026/9/24 16:45:58 阅读更多 →

最新新闻

Java学生宿舍管理系统:从数据库设计到事务处理实战

Java学生宿舍管理系统:从数据库设计到事务处理实战

简介:这是一套面向高校计算机专业学生与Java Web初学者的学生宿舍管理系统完整项目资料,围绕住宿信息管理、宿舍与床位分配、日常行为记录等核心业务展开,可用于课程设计、毕业设计或Java Web入门实战。压缩包共661个文件,约77.19…

2026/9/24 18:54:29 阅读更多 →
Java后端配小程序前端:地图定位与轨迹记录实战

Java后端配小程序前端:地图定位与轨迹记录实战

简介:这是一份面向Java后端开发者与小程序入门者的实战型项目源码,围绕小程序地图定位场景,演示如何用Java服务端配合前端完成位置服务。内容涉及GPS与网络定位、地理编码与反地理编码、路径规划、位置实时更新、隐私安全处理及前后端接口设计…

2026/9/24 18:54:29 阅读更多 →
Flutter鸿蒙适配实战:epubx电子书解析库改造全记录

Flutter鸿蒙适配实战:epubx电子书解析库改造全记录

做 Flutter 开发这几年,最让我头疼的不是业务逻辑,而是三方库跨平台的兼容性。鸿蒙生态起来之后,这个问题更是被放大:很多在 Android 上躺着就能跑的插件,一到鸿蒙平台上就是各种异常,轻则 API 找不到&…

2026/9/24 18:54:29 阅读更多 →
Qoder 安装与使用教程

Qoder 安装与使用教程

一、概述Qoder 是一款面向软件开发的智能体编码平台,基于代码库全局上下文实现辅助编码、项目迭代、任务自动化等能力。软件兼容主流操作系统与开发工具,提供桌面 IDE、编辑器插件、命令行等多种部署形态,适用于程序开发、代码调试、项目重构…

2026/9/24 18:54:29 阅读更多 →
Apache Arrow PyArrow 数据类型与内存数据模型完全指南:从 DataType 到 Table 的列式数据全解析

Apache Arrow PyArrow 数据类型与内存数据模型完全指南:从 DataType 到 Table 的列式数据全解析

数据工程大数据序列化数据分析 【免费下载链接】arrow Apache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing 项目地址: https://gitcode.com/gh_mirrors/arrow13/arrow 点击查看 免费下载 Apache Arrow 通过&quo…

2026/9/24 18:54:29 阅读更多 →
基于Java开发的小程序地图定位:从后端签名到前端选点完整链路

基于Java开发的小程序地图定位:从后端签名到前端选点完整链路

简介:这是一份面向Java后端开发者与小程序入门者的实战型项目源码,围绕「小程序地图定位」这一常见移动场景,演示如何用Java技术栈配合前端完成位置服务。资源共38个文件,以15张png界面截图与图标、6个js逻辑脚本、5个wxss样式、4…

2026/9/24 18:53:29 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →