composer depends查谁引入某包,composer prohibits查谁阻止某版本安装,二者配合--tree可快速定位冲突源头,不改文件、不装包,专治“版本对得上却装不上”问题。

Composer 的“高级功能”不是炫技,而是解决你正在卡住的问题:依赖查不出谁在拦路、本地包改了不生效、autoload 报错却找不到原因、CI 日志被进度条刷屏、锁文件该不该提交。
composer depends 和 composer prohibits 怎么快速定位依赖冲突
看到 Your requirements could not be resolved 却不知道谁在挡路?这两个命令不改文件、不装包,纯分析,专治“明明版本对得上,就是装不上”。
-
composer depends vendor/package-name:查清楚「谁拉进了这个包」。比如composer depends monolog/monolog会列出所有直接或间接依赖它的包,帮你确认是不是某个require-dev包把它带进了生产环境 -
composer prohibits vendor/package:version:不是查“谁用了它”,而是查“谁不让它装”。比如你想装phpunit/phpunit:^10失败,运行composer prohibits phpunit/phpunit:9.6就能立刻看到是哪个包硬性要求^8.0 - 它们都支持
--tree参数(如composer depends --tree monolog/monolog),输出依赖链路,比扫屏快得多
path 仓库 + replace 怎么配才让本地包实时生效
主项目依赖本地的 mycompany/auth,但每次改完都要 composer update 才生效?说明你漏了 replace,或者 url 路径没对准含 composer.json 的目录。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在主项目
composer.json的repositories里加:{"type":"path","url":"../auth"},注意url是相对路径,且必须指向有composer.json的根目录 - 同时在
replace字段声明:"replace": {"mycompany/auth":"self.version"},否则 Composer 仍会尝试从 Packagist 下载同名包,覆盖你的本地修改 - 删掉
vendor/mycompany/auth后运行composer update mycompany/auth,它就会软链接到你本地目录——改代码,立刻生效
composer dump-autoload -o 为什么有时反而让问题更隐蔽
类明明存在、命名空间也对,但报 Class not found,第一反应不该是翻 PSR-4 路径,而是检查 autoload 是否刷新过。而 -o(即 --optimize)生成 classmap 后,会绕过 PSR-4 的目录扫描逻辑,导致新增类文件不被自动发现。
- 开发中频繁增删类时,别默认加
-o;用composer dump-autoload -a强制重生成所有规则,适合调试映射失效 -
files类型 autoload(比如全局函数文件)改了之后,也必须手动dump-autoload,它不会监听变化 - 生产构建才用
composer dump-autoload --optimize --classmap-authoritative,--classmap-authoritative表示“只认 classmap 里的类”,性能高,但也意味着漏配就真找不到
composer list 和 --no-progress 怎么用才不白用
composer list 不是翻文档的替代品,而是命令发现工具;--no-progress 也不是“让 Composer 安静”,它只禁下载和安装阶段的实时进度条,其他提示照常输出。
- 用
composer list config只看所有config:开头的命令,省去扫屏;composer list require查依赖相关操作;composer list --short输出纯命令名,适合脚本解析 -
--no-progress不抑制Writing lock file、错误信息、或脚本输出(如php artisan optimize的结果) - CI/CD 中真正稳妥的组合是:
composer install --no-progress --no-interaction --optimize-autoloader;若还要压制成功提示,才加--quiet,但它也会吞掉Warning—— 某些废弃提示可能就此被忽略
最容易被忽略的是:所有这些命令的效果都依赖于 composer.lock 是否被提交、是否与 composer.json 语义一致;一旦锁文件和配置脱节,再高级的命令也救不了依赖漂移。










