--sort-packages 仅在新增依赖时按字母顺序插入,不重排已有条目;它不是格式化工具,而是插入策略,真正排序需用 composer normalize 或外部 JSON 工具。

composer require --sort-packages 不会自动排序已存在的依赖,它只在新增包时按字母顺序插入到 composer.json 的 require(或 require-dev)区块中。
为什么 --sort-packages 看起来没生效?
常见误解是运行后整个 require 区块会被重排——其实不会。Composer 只在写入新条目时做插入排序,不触碰已有顺序。如果你刚执行 composer require foo/bar,而 foo/bar 按字母排应在 monolog/monolog 之前,但后者已存在且靠前,Composer 不会挪动它。
- 该选项不影响
composer update行为,仅作用于require、remove、install(首次安装时)等写入操作 - 若
composer.json原本无格式缩进或键顺序混乱,--sort-packages也不会修复 JSON 结构,只管键名顺序 - 它只排序顶层
require和require-dev,不处理repositories、config等其他字段
如何真正让所有依赖按字母排序?
需要手动或借助工具重写整个 require 区块。Composer 自身不提供“重排现有依赖”命令,但有可靠替代方案:
- 用
composer normalize --dry-run查看差异(需 Composer 2.2+),再加--no-interaction实际执行,它会重排 + 格式化整个composer.json - 临时清空
require,再逐个composer require vendor/name --sort-packages(不推荐,易出错) - 用脚本解析 JSON、对
require对象的 key 排序、写回文件(Python/PHP 都可,注意保留注释是不可能的)
--sort-packages 的实际使用场景
适合团队协作初期统一风格,或 CI 中确保每次 require 新包都插在正确位置,避免合并冲突。但它不是“格式化工具”,而是“插入策略”。
- 推荐在
composer.json里固定配置:"config": { "sort-packages": true },这样所有成员默认生效,无需每次敲参数 - 注意:该配置对
composer create-project也起作用,但不影响已 lock 的composer.lock顺序(lock 文件本身不按字母排,也不该手动改) - 如果项目已用其他排序工具(如
jq脚本),别混用,否则 git diff 会反复颠倒顺序
真正麻烦的不是加参数,而是意识到 Composer 的“排序”只发生在新增瞬间——想一劳永逸,得靠 composer normalize 或外部 JSON 工具,而且得在所有人编辑前达成一致。










