laravel pint 默认仅扫描 app、config、database、routes、tests 五个目录,不处理 src、packages 等自定义路径;pint.json 必须位于根目录、严格小写、json 语法合法,否则退回到默认 preset。

直接说结论:Laravel Pint 能快速统一团队 PHP 代码风格,但默认只处理 app、config、database、routes、tests 这 5 个目录,不扫 src、packages、stubs 等常见自定义路径——漏配就等于白配。
为什么运行 pint 后有些文件没被格式化?
默认行为只扫描固定目录,不是“所有 .php 文件”。比如你把领域逻辑放在 src/ 下,或封装了独立包在 packages/,这些路径不会被自动纳入。
- 确认当前项目实际 PHP 代码所在路径,常见遗漏项:
src、packages、scripts、stubs - 别依赖 glob(如
"**/*.php"),pint的paths字段只接受精确路径数组,写错或不支持的表达式会被静默忽略 - 执行
./vendor/bin/pint --test后若输出no files found,说明paths里至少有一个路径不存在或拼写错误
pint.json 配置不生效的三个高频原因
配置文件存在 ≠ 规则生效。Pint 对配置极其敏感,稍有偏差就退回到默认 laravel preset。
- 文件名必须是严格小写的
pint.json,.pint.json、pint.config.json、PINT.JSON全部无效 - JSON 格式必须合法:不能用单引号,末尾不能多逗号,键名必须双引号包裹(如
"preset",不能写preset) - 配置必须放在项目根目录,子目录下的
pint.json(如tests/pint.json)完全不被读取
如何安全切换预设或启用自定义规则?
改规则不是覆盖,而是叠加或替换。Pint 底层用的是 PHP-CS-Fixer,规则名必须与其兼容,否则会报 Unknown fixer 错误。
- 切换预设只需改
"preset"字段值:"psr12"或"symfony",无需额外装包 - 启用单条规则时,必须写进
"rules"对象,且结构要对齐,例如:"array_syntax": {"syntax": "short"} - 禁用某条规则写成:
"braces": false;设为true表示启用默认参数,不推荐省略参数对象 - 不要和已有的
.php-cs-fixer.php共存——Pint 不读它,两者规则打架会导致 CI 失败
CI/CD 和 Git 提交前怎么避免踩坑?
自动化流程里最容易出问题的是环境一致性与权限。本地能跑,CI 报错,大概率是这两点没对齐。
- CI 中务必显式安装:
composer require laravel/pint --dev,别依赖“Laravel 自带”——旧项目或镜像可能不含 - Linux/macOS 下确保
vendor/bin/pint有执行权限(CI 容器常缺失),加一步chmod +x vendor/bin/pint - Git hook 推荐用
--dirty模式:./vendor/bin/pint --dirty,只格式化暂存区里的变更文件,避免意外触碰他人代码 - Blade 模板里的
@php块、PHP 内嵌字符串、.php后缀的非 PHP 文件(如配置导出脚本),pint一律不处理——这类需单独用blade-formatter或人工约定
最易被忽略的一点:Pint 的 paths 和 exclude 是互斥关系,不是叠加过滤。一旦你在 paths 里漏掉某个目录,哪怕它没在 exclude 里,也不会被扫描——它根本不在候选列表里。











