sort-packages 是 Composer 的静态格式化开关,仅在 composer require 或 update 时重排 composer.json 的 require 和 require-dev 字段键序,install 不触发,且对其他字段无效。

Composer 的 sort-packages 不是运行时功能,而是 JSON 文件的静态格式化开关——它只在 composer require 或 composer update 时生效,且仅影响 composer.json 中 require 和 require-dev 的键序。
为什么 sort-packages 看起来没反应
常见错误现象:开了配置、改了包、执行 composer install,但 composer.json 顺序不变。
-
composer install不会重排依赖,它只按composer.lock安装,不读写composer.json - 必须用
composer require(加新包)或composer update(更新现有包),才会触发重排逻辑 - 如果所有包版本都已锁定且无变更,
composer update可能跳过写入composer.json,也就不会重排 - 该配置对
autoload、scripts、config等其他字段完全无效
怎么正确启用 sort-packages
使用场景:团队协作中统一依赖声明顺序,避免 Git diff 冲突;或 CI 中校验 composer.json 格式。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在项目根目录的
composer.json顶层添加:"config": { "sort-packages": true } - 或者全局启用(不推荐):
composer config -g sort-packages true - 确认生效:运行
composer require phpunit/phpunit --dev,观察require-dev区块是否按字母序插入 - 注意:如果已有依赖未排序,单次操作只会影响新增/更新项;要全量重排,可临时删掉
require下所有包,再逐个require回来(慎用于生产项目)
sort-packages 的实际排序规则
参数差异和边界情况比想象中多,容易误以为“没排好”。
- 排序依据是包名(
vendor/name),不是别名或版本号;monolog/monolog排在psr/log前面,因为mp - 大小写敏感:
Symfony/flex会排在symfony/console之后(大写SASCII 值小于小写s) - 不处理注释或空行:原有注释不会随包移动,可能错位;建议搭配
composer normalize(需插件)做完整规范化 - 性能无影响:纯 JSON 键重排,毫秒级,但频繁触发(如脚本中循环
require)会拖慢整体流程
真正麻烦的是混合了手动维护包和自动管理的项目——比如有人直接编辑 composer.json 添加包,又忘了跑 update。这时候顺序就不可控了,Git 提交里全是键序变动的噪音。要么全交给 Composer 管,要么干脆关掉这个配置,别半吊子用。

















