composer install 不处理换行符,其下载的文件换行符继承自源包;php解析含crlf的文件可能报语法错误,根本原因在于git的core.autocrlf设置、编辑器保存格式及ci中未处理权限与行尾,需从源头统一lf并显式赋权。

Composer install 本身不处理文件换行符——它只下载、解压、复制 PHP 源码,换行符完全继承自包作者提交时的 Git 设置或 ZIP 打包方式。真正出问题的,是这些源码被 PHP 解析、被脚本执行、或被你用文本编辑器打开时的隐式转换。
为什么 vendor 里某些 PHP 文件在 Windows 上报语法错误
常见现象:Linux 下正常运行的包,composer install 到 Windows 后,php vendor/autoload.php 报 Parse error: syntax error, unexpected '}' 或类似错误,但文件内容肉眼看不出异常。
- 根本原因不是 Composer,而是 Git 在 Windows 上默认启用
core.autocrlf=true,把 LF 自动转成 CRLF;而 PHP 解析器(尤其老版本)对行尾\r敏感,可能干扰 token 解析 - 更隐蔽的情况:包作者用 Windows 提交代码,Git 未设
core.eol=lf,导致.php文件实际含\r\n,但 Composer 下载 ZIP 包时保留原样,Linux 用户也无感——直到某天 CI 环境用不同 Git 配置检出,就崩了 - 验证方法:用
xxd vendor/some/package/Class.php | head -n 5(Linux/macOS)或 PowerShell 的Get-Content -Encoding Byte Class.php | Select -First 20查看真实字节,找0d 0a(CRLF)还是0a(LF)
composer.json 和 scripts 中的换行符陷阱
composer.json 是 JSON 格式,标准规定只允许 \n(LF)作为行分隔符;但 Windows 编辑器(如记事本)保存时会强制加 \r,导致 composer install 直接失败:
- 错误信息:
Failed to parse json ... Invalid UTF-8 sequence或JSON decode error: Syntax error - scripts 字段里写
"post-install-cmd": "php script.php\r\n"(Windows 编辑器残留),Linux 下 shell 会把\r当作命令名一部分,报php script.php^M: command not found - 解决办法:用 VS Code、Notepad++ 等支持 LF 行尾的编辑器,并设为默认;或用命令行统一清理:
sed -i 's/\r$//' composer.json(Linux/macOS)、(Get-Content composer.json) -replace "\r\n", "`n" | Set-Content composer.json(PowerShell)
vendor/bin 脚本在跨平台执行时的换行与权限双重问题
Linux/macOS 下 vendor/bin/phpunit 执行失败,常被误判为换行符问题,其实核心是两个独立问题叠加:
- 换行符:脚本第一行
#!/usr/bin/env php若含\r(即#!/usr/bin/env php\r),bash 会尝试执行名为php^M的命令,报No such file or directory - 权限位:ZIP 包不保留
x权限,composer install后该文件在 Linux/macOS 默认不可执行,必须手动chmod +x vendor/bin/*;Windows 不校验权限,所以本地开发没感觉,CI 就挂 - 最稳妥做法:CI 脚本里加两行:
find vendor/bin -type f -exec chmod +x {} \;(Linux/macOS)、PowerShell 里用Get-ChildItem vendor\bin\* -File | ForEach-Object { chmod +x $_.FullName }
换行符问题从来不是 Composer 的责任,它只是个搬运工;真正的控制点在 Git 配置、编辑器设置、以及你是否在 CI 中显式处理了权限和行尾。别指望工具自动修复,得从源头堵住 \r 进入代码树。











