composer.json 被破坏缩进是因为 composer 使用 php 原生 json_encode() 重写文件,该函数默认不格式化、无缩进且键序可能改变;真正有效的方案是用 php -r 结合 json_pretty_print 或 jq 工具在提交前自动美化。

composer.json 为什么会被破坏缩进
Composer 自身不负责格式化 composer.json,它只读写内容、不关心空格和换行。每次执行 composer require、composer update 或 composer install,都会由 Composer 内部的 JSON 编码器(基于 json_encode())重写整个文件——而 PHP 默认的 json_encode() 不带格式化选项,结果就是单行、无缩进、键名顺序也可能变。
用 composer dump-autoload --optimize 配合 --no-dev?不,这没用
别被名字误导:composer dump-autoload 只处理 vendor/autoload.php 和类加载映射,完全不碰 composer.json。想靠它格式化 JSON 是无效操作。
真正有效的三步自动格式化方案
目前没有 Composer 原生命令能格式化 composer.json,但可以组合使用以下方式实现「提交前自动整齐」:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用
jq命令行工具:安装后运行jq -S . composer.json > tmp.json && mv tmp.json composer.json,-S表示按 key 排序(可选),.表示原样输出并美化缩进 - 用 PHP 自带命令:运行
php -r "echo json_encode(json_decode(file_get_contents('composer.json')), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . \"\n\";" > composer.json,确保保留中文和斜杠不转义 - 接入 Git pre-commit 钩子:在
.git/hooks/pre-commit里加一行php -r "file_put_contents('composer.json', json_encode(json_decode(file_get_contents('composer.json')), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));",这样每次 commit 前自动重写为整齐格式
注意:JSON 键顺序会被重排(PHP json_decode 返回关联数组,遍历时顺序不保证),如果项目依赖特定顺序(比如某些老旧脚本硬编码索引),就得手动维护或改用 jq 的 --sort-keys 控制。
为什么不要用 IDE 自动保存时格式化
很多编辑器(如 VS Code)设了「保存时格式化 JSON」,但容易和 Composer 冲突:你刚保存完整齐的 composer.json,一跑 composer require foo/bar,它立刻又给你压成一行。更麻烦的是,IDE 格式化可能加尾逗号、调整字符串引号风格,而 Composer 写入时会抹掉这些——来回覆盖导致 Git diff 一团乱,协作时徒增噪声。
最稳的做法是:只让机器在「确定要提交」那一刻格式化,且全程用同一套规则(推荐 PHP 原生 json_encode(..., JSON_PRETTY_PRINT)),避免编辑器、CLI 工具、CI 脚本各搞一套。










