如何为你的Composer包添加PHPStan或PHP-CS-Fixer支持?(质量保障)

11次阅读

composer 包中集成 phpStan 和 PHP-CS-Fixer 需配置可复现的静态分析与代码格式化:PHPStan 通过 phpstan.neon 设定分析路径与等级,绑定 composer script;PHP-CS-Fixer 用 .php-cs-fixer.php 定义规则并集成至开发流程。

如何为你的Composer包添加PHPStan或PHP-CS-Fixer支持?(质量保障)

直接在 Composer 包里集成 PHPStan 和 PHP-CS-Fixer,不是加个依赖就完事——关键是要让它们真正跑起来、可复现、易维护,且不干扰用户使用。

PHPStan:静态分析要覆盖你的代码边界

PHPStan 能帮你提前发现类型错误、未定义方法、死代码等问题。对开源包尤其重要,因为调用方式不可控。

  • 安装时加 --dev:运行 composer require --dev phpstan/phpstan
  • 在项目根目录加 phpstan.neon(或 phpstan.neon.dist),内容至少包含:
    parameters:   level: 6   paths:     - src   excludePaths:     - tests/_support
  • composer.jsonscripts 里加一行:"phpstan": "phpstan analyse --configuration=phpstan.neon",之后就能用 composer phpstan 快速检查
  • 如果包支持多 PHP 版本,建议在 gitHub Actions 中用 phpstan/phpstan-shim 避免依赖冲突

PHP-CS-Fixer:格式统一靠规则,不是靠人盯

代码风格一致是协作基础,尤其当别人给你提 PR 时,别让空格和换行成为合并障碍。

  • 安装:composer require --dev friendsofphp/php-cs-fixer
  • 配置文件 .php-cs-fixer.php(推荐用 PHP 数组写法,比 json 更灵活):
    setRules([         '@PSR12' => true,         'array_syntax' => ['syntax' => 'short'],         'declare_strict_types' => true,         'no_unused_imports' => true,     ])     ->addFinder(PhpCsFixerFinder::create()->in(['src', 'tests']));
  • composer.json 中添加脚本:"cs-fix": "php-cs-fixer fix --dry-run --verbose"(CI 用)和 "cs-fix-write": "php-cs-fixer fix"(本地修)
  • CI 中建议先用 --dry-run 失败即退出,避免格式问题偷偷过 CI

CI 自动化:把质量检查变成每次提交的守门员

光本地能跑没用,得让 github Actions 或 gitlab CI 每次 PR 都自动验一遍。

立即学习PHP免费学习笔记(深入)”;

  • .github/workflows/test.yml 中加两个 job:
    • phpstan:用官方 PHPStan action 或直接 run: composer phpstan,PHP 版本建议和最低支持版本一致
    • cs-check:运行 composer cs-fix,失败说明有格式问题
  • 加上 cache: composercache: ~/.composer 加速重复构建
  • 如果包带测试,把 PHPStan 和 CS Fixer 放在 test job 之前,早发现问题早修复

文档与约定:让协作者一眼知道怎么参与质量共建

再好的工具,没人用等于没装。在 CONTRIBUTING.md 里写清楚三件事:

  • 运行命令:composer phpstancomposer cs-fix-write
  • CI 会检查什么(比如 “PHPStan level 6 不允许任何 Error”)
  • 如何本地预检:make check(可选封装脚本)或推荐 ide 插件(如 phpstorm + PHP-CS-Fixer 插件)

基本上就这些。不复杂但容易忽略的是:配置文件要提交进仓库、CI 要真实执行、贡献指南要有人读——质量保障不是加个工具,而是建一套可落地的小闭环。

text=ZqhQzanResources