启用 sort-packages 后仅对 require 和 require-dev 字段内的包名按键字母升序排序,不影响 lock 文件、autoload、scripts 等其他字段,且仅在 composer require 或 update 修改 composer.json 时生效。

sort-packages 是 config 的布尔选项,不是命令
很多人搜 composer sort-packages 以为是个可执行命令,实际它只是 composer.json 里 config.sort-packages 的配置项,值为 true 或 false。Composer 不会主动“运行”它,而是在执行 composer require、composer update 等写入依赖的操作时,自动按字母序重排 require 和 require-dev 下的包名。
启用后哪些字段会被排序?只影响顶层依赖键
开启 "sort-packages": true 后,仅对以下两个对象的键(即包名)做升序排列:
-
require对象下的所有键(如"monolog/monolog"、"phpunit/phpunit") -
require-dev对象下的所有键
不会触碰:
- 嵌套结构(如
config.platform、scripts里的键) - 版本号字符串本身(
"^2.0"不会变成"^1.9") - 注释(JSON 标准不支持注释,任何编辑器里手动加的 // 都会在写入时丢失)
为什么开了也不生效?常见失效场景
最常遇到的“没排序”其实是操作没触发写入逻辑:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 仅运行
composer install不会重排 —— 它只读composer.lock,不改composer.json - 手动修改
composer.json后没运行任何写依赖的命令,自然不会重排 - 使用了
--no-update或--dry-run参数,跳过了依赖写入阶段 -
composer.json顶层没有config段,或拼写错误(比如写成"sort_packages"或"sortPackages")
验证是否生效:删掉一个包再 composer require foo/bar,观察新条目是否插入到字母序正确位置,而不是追加到末尾。
排序对 lock 文件和协作的影响
sort-packages 只改变 composer.json 的键顺序,不影响 composer.lock 内容或安装行为。但它会影响 Git 提交差异:
- 多人协作时,若有人开、有人关该配置,每次
composer update都可能引发整块依赖重排,造成大量无意义 diff - 建议团队统一在项目根目录的
composer.json中显式声明:"sort-packages": true,避免本地 config 全局设置干扰 - CI 环境中若用
composer install --no-interaction,只要不改composer.json就完全不受影响
真正容易被忽略的是:它不解决依赖冲突,也不影响 autoload 顺序,纯属格式化手段 —— 如果你看到 PR 里 composer.json 依赖顺序乱,先确认对方有没有配这个,而不是怀疑自己环境有问题。

















