--sort-packages 仅在 composer require、update 或 install 时按包名 ASCII 升序重排 require/require-dev,不改变依赖逻辑;需配置 "sort-packages": true 启用自动排序。

--sort-packages 不会改变依赖逻辑,只按字母顺序重排 composer.json 中的 require 和 require-dev 列表 —— 这是团队协作中降低合并冲突、提升可读性的低成本手段。
什么时候运行 --sort-packages 最有效?
它只在执行 composer require、composer update 或 composer install 时生效,且仅作用于被修改的依赖段。单纯运行 composer install --sort-packages 不会重排已存在的包。
- 新增包时:用
composer require --sort-packages monolog/monolog,新条目会插入到正确字母位置,其余保持原序 - 批量更新后:用
composer update --sort-packages,整个require和require-dev都会被重新排序 - CI/CD 中慎用:如果
composer.json已被手动调整过顺序,自动排序可能触发无意义的 Git diff
--sort-packages 的排序规则和边界情况
它按包名(即 vendor/name)的 ASCII 字符串升序排列,不区分大小写,但大小写字母本身在 ASCII 中有固定顺序(A–Z 在 a–z 前)。这意味着 symfony/console 会排在 symfony/yaml 前,但 Symfony/console(首字母大写)会排在所有小写包之前 —— 实际中几乎不会出现,因为 Packagist 强制小写 vendor 名。
- 只排序顶层依赖,不处理嵌套结构(如
provide、conflict、replace) - 忽略版本约束内容,只看包名字符串:
"phpunit/phpunit": "^9.5"和"phpunit/phpunit": "9.5.*"排序结果一致 - 不会合并重复包名(Composer 本身禁止重复键)
如何让排序成为团队默认行为?
在项目根目录的 composer.json 中添加配置项,避免每次命令都加参数:
{
"config": {
"sort-packages": true
}
}
此后所有本地 composer require 和 composer update 都自动启用排序。注意该配置不传递给依赖包,仅作用于当前项目。
- Git 提交前建议统一执行一次
composer update --sort-packages,确保全量有序 - 编辑器或 pre-commit hook 中不必额外校验顺序 —— Composer 自己保证一致性
- 如果某次提交意外跳过了排序(比如用了
--no-update),下一次带--sort-packages的操作会自动修正
真正容易被忽略的是:排序只发生在写入 composer.json 的那一刻;如果你手动编辑 JSON 并打乱顺序,Composer 不会主动“修复”,除非你再次触发依赖变更命令。










