config.sort-packages 控制 composer.lock 中 packages 和 packages-dev 数组是否按包名 ASCII 升序排列,避免协作中因顺序不同产生无意义 diff;需在 composer.json 的 config 段设为 true,并执行 composer update --lock 生效。

composer.json 里 config.sort-packages 是什么作用
它控制 composer.lock 中 packages 和 packages-dev 数组的条目是否按字母序排列,只影响 lock 文件内容,不改变 composer.json 本身。
默认值是 false,但强烈建议设为 true——这不是为了“好看”,而是避免协作中出现无意义 diff。比如 A 同学 require foo/bar,B 同学同时 require baz/qux,关闭排序时两人生成的 composer.lock 里包顺序可能完全相反,Git 提交记录全是位置变动,根本看不出真实变更。
启用后,所有包名(包括命名空间前缀)统一按 ASCII 码升序排列,monolog/monolog 永远排在 psr/log 前面,不受添加顺序影响。
怎么开启 sort-packages 并确保生效
直接在项目根目录的 composer.json 的 config 段里加一行:
"config": {
"sort-packages": true
}
然后执行一次 composer update --lock(不是 install),让 Composer 重写 composer.lock 并应用排序规则。
- 如果项目已有
composer.lock,仅改composer.json不会自动重排,必须触发 lock 文件更新 - CI/CD 流水线中若用
composer install,只要 lock 文件已排序,就无需额外操作 - 不要在全局配置(
composer config -g)里设sort-packages,它只对本地项目生效,全局设置无效
为什么 composer require 后新包没进排序位置
常见原因是:你运行了 composer require,但没加 --update-with-dependencies 或没触发 lock 更新,导致新包被追加到 composer.lock 末尾,绕过了排序逻辑。
根本机制是:Composer 只在完整解析并重写整个 packages 数组时才排序,而 require 默认只做最小更新(即“增量写入”)。要强制重排,必须显式触发全量 lock 重建:
-
composer update --lock:最稳妥,强制重读composer.json并重排全部依赖 -
composer update vendor/package-name --lock:只更新指定包,但仍会重排整个数组 - 避免只用
composer require后不跟任何 lock 相关操作,尤其在多人协作分支上
sort-packages 对性能和兼容性有影响吗
没有运行时性能影响,也不改变任何依赖行为——它只是 lock 文件的序列化格式调整。
但要注意两个实际限制:
- Composer 1.x 不支持该选项,必须用 Composer 2.0+(2026 年绝大多数环境已满足)
- 某些老旧插件(如未升级的
composer-merge-plugin)可能忽略或破坏排序结果,遇到时优先检查插件版本是否兼容 Composer 2.5+
真正容易被忽略的是:这个开关只管 lock 文件,不管 composer.json 里的 require 字段顺序。如果你希望 composer.json 也保持整洁,得用 composer-normalize 这类独立工具,sort-packages 完全不碰它。











