pint 默认仅扫描 app、config、database、routes、tests 五个目录,若文件在 src 等自定义路径下则静默跳过;启用需在根目录 pint.json 中显式声明全量 paths,且文件名、JSON 语法、PHP 版本(≥8.1)均须严格合规。

直接运行 ./vendor/bin/pint 就能修复绝大多数风格问题,但“修不到”不是工具失灵,而是你没踩中它真正生效的几个硬性条件。
为什么 pint 没动我新写的 src/Services/UserService.php
它根本没扫描这个文件——pint 默认只处理 app、config、database、routes、tests 这五个目录。哪怕路径完全正确、语法合法、已 git add,只要不在默认列表里,就静默跳过。
- 想包含
src或packages?必须显式声明全部路径:"paths": ["app", "config", "database", "routes", "tests", "src"] -
paths是全量覆盖,不是追加:只写["src"]会丢掉所有默认目录 - 路径名大小写敏感,
App≠app,src/末尾斜杠可选但建议统一不加 - Blade 文件、
.json配置、.js脚本永远不会被处理——这不是 bug,是设计
pint.json 改了却没生效,常见失效点
只要项目根目录存在 pint.json,pint 就彻底放弃内置 preset,所有规则、路径、排除项都必须完整写出,且格式零容忍。
- 文件名必须是小写
pint.json,不能是Pint.json、pint.config.json或带 BOM - JSON 语法必须严格合法:禁止末尾逗号、单引号、注释(哪怕只是
//) -
"preset": "laravel"和"rules"同时存在时,rules会完全接管,preset仅兜底——不会合并规则 - 改完立刻跑
./vendor/bin/pint --test,如果输出no files found,八成是paths里写了不存在的目录
CI 环境里 pint 报错或静默失败
本地能跑不等于 CI 能跑,环境差异才是最大拦路虎。
-
Could not open input file: vendor/bin/pint:CI 中composer install用了--no-dev,或缓存复用了旧vendor/(composer.lock没变但laravel/pint版本已升) -
PHP version is lower than required:pintv1.x 强制要求 PHP 8.1+,低于该版本会静默退出或报此错 - Linux/macOS CI 脚本里执行前没加
chmod +x vendor/bin/pint,权限不足导致命令不可执行 -
--test在 CI 中返回非零退出码是正常行为(表示有违规),别当成错误;若需“有错也过”,得用|| true显式忽略
最常被忽略的是:Pint 不解析 Blade 里的 @php 块,也不碰 .php 后缀但实际是 JSON/YAML 的配置文件——它靠真实 PHP 语法判断,不是靠后缀猜。真要格式化这类内容,得换其他工具。


















