应写为"analyse": "vendor/bin/phpstan analyse --configuration=phpstan.neon --autoload-file=vendor/autoload.php",确保PHPStan以项目根目录为基准加载配置和自动加载器,适配dev依赖、CI环境及各类autoload类型。

composer.json 里 scripts 的 analyse 怎么写才真正调用 PHPStan
直接写 "analyse": "phpstan analyse" 很常见,但多数情况下会失败——PHPStan 找不到配置、不识别 vendor/autoload.php、甚至根本没装在本地。
关键不是“能不能跑”,而是“以什么上下文跑”。PHPStan 需要自动加载器和配置文件才能正确解析类型。
- 必须显式指定
--configuration,否则它只扫描当前目录且忽略phpstan.neon - 如果 PHPStan 是 dev-dependency(推荐),得用
vendor/bin/phpstan路径,而不是全局命令 - 加
--autoload-file=vendor/autoload.php更稳妥,尤其在自定义 autoloader 或测试环境时
正确示例:
"scripts": {
"analyse": "vendor/bin/phpstan analyse --configuration=phpstan.neon --autoload-file=vendor/autoload.php"
}
PHPStan 配置文件路径没生效?检查 composer.json 和工作目录关系
运行 composer run analyse 时,当前工作目录决定相对路径解析起点。很多人把 phpstan.neon 放在子目录(比如 tools/phpstan.neon),却在 scripts 里写 --configuration=phpstan.neon,结果报错 File 'phpstan.neon' not found。
立即学习“PHP免费学习笔记(深入)”;
- 路径是相对于执行
composer run的目录,不是composer.json所在目录 - 推荐统一放在项目根目录,用
--configuration=phpstan.neon - 如果必须放别处,用绝对路径或
${PWD}(仅 bash/zsh)不保险,改用$(pwd)/tools/phpstan.neon也不跨平台;最稳是挪到根目录
为什么 phpstan analyse src/ 报 “Class not found”,但 IDE 不报?
因为 PHPStan 默认不自动包含 composer autoloader,而 IDE 依赖已生成的索引或 PSR-4 映射。它不是靠运行时加载,而是靠静态解析规则。
- 漏掉
--autoload-file=vendor/autoload.php是最常见原因 - 若项目用了
classmap或files类型 autoload,确保它们已由composer dump-autoload生效 - PHPStan 8+ 默认启用
scanDirectories,但不会自动扫描vendor;如需分析第三方代码,得手动加--paths-file或配置includes
验证是否加载成功:加 -v 参数看输出里有没有 Loading configuration 和 Loading autoloader。
CI 环境下 composer run analyse 失败,但本地正常?
本质是环境差异:CI 通常跳过 composer install --no-dev,导致 vendor/bin/phpstan 根本不存在;或者用了缓存,但没更新 vendor/autoload.php。
- 确保 CI 步骤中明确执行
composer install --no-interaction(不加--no-dev) - 不要在 CI 中依赖全局 PHPStan,哪怕有 cache,版本也容易错配
- PHPStan 配置里避免用
includes: [../some-global-config.neon],CI 没那个上级目录
一个最小可靠 CI 命令:composer install --no-interaction && composer run analyse。
level 设置和 excludePaths 是否同步更新了 —— 改了代码结构但忘了调配置,分析就会漏掉新目录,或者卡在旧的 stub 文件上。



















