先确认是否需装require-dev包,本地开发应查冲突源头而非直接删除;生产或ci必须加--no-dev跳过,避免因php版本、扩展缺失或脚本失败导致install中断。

composer install 时 require-dev 包报错,先别删 dev 依赖
require-dev 报错不等于项目不能跑,它只影响本地开发流程(比如测试、代码检查),但可能拦住整个 install 流程——尤其当某个 dev 包和当前 PHP 版本/扩展冲突,或被其他包间接锁死时。composer install 默认会装 require 和 require-dev,除非加 --no-dev。
常见现象包括:phpunit/phpunit 因 PHP 版本不兼容失败、larastan/larastan 依赖的 PHP 扩展未启用、friendsofphp/php-cs-fixer 的某个子依赖要求 ext-intl 但没装。
- 先确认是否真需要这些 dev 包:CI 构建或生产部署通常用
composer install --no-dev,跳过它们更安全 - 如果必须装(比如本地跑测试),别急着删
composer.json里的require-dev条目——先查冲突源头,否则可能掩盖真实环境问题 - 运行
composer why-not phpunit/phpunit:10.5(把包名和版本换成报错里出现的)看谁在拦路;输出里常有类似myproject requires php ^8.0但phpunit/phpunit v10.5 requires php >=8.1
“Package is not installed” 出现在 dev 包上,大概率是 lock 文件残留
这个错误不是包没下载,而是 vendor/ 里确实没它——但原因往往不是网络或权限,而是 composer.lock 和 composer.json 的 require-dev 段不一致。比如你删了 phpunit 却没删 lock 文件里对应条目,Composer 就会坚持去装一个已声明但实际不该存在的包。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 执行
composer show phpunit/phpunit,如果返回no such package,说明它根本没进依赖图,lock 文件里那行是“幽灵记录” - 删掉
composer.lock和vendor/,再跑composer install(仅限开发机;CI 环境应保证 lock 文件始终由开发机生成并提交) - 或者保守点:用
composer update --lock重写 lock 文件,它只更新锁结构,不碰已安装包
PHP 版本或扩展缺失导致 dev 包装不上,别用 --ignore-platform-reqs 硬顶
很多 dev 工具(如 pestphp/pest、phpstan/phpstan)对 PHP 版本和扩展更敏感。报错里明确写着 ext-dom 或 php: >=8.2 就别猜——直接验证。
- 运行
php -v和php -m | grep -E "dom|xml|mbstring",CLI 的模块列表和 Web 不一定一致 - 执行
composer check-platform-reqs,它会逐条列出所有缺失项,比人工翻报错快得多 -
--ignore-platform-reqs可能让 install 成功,但后续phpunit运行时会直接 fatal error,因为 DOMDocument 类根本不存在 - Ubuntu/Debian 下补扩展:比如 PHP 8.2,就
sudo apt install php8.2-dom php8.2-xml,别漏掉php8.2-xml(DOM 依赖 XML)
某些 dev 包自带 post-install-cmd 脚本,失败后卡住 vendor 目录写入
像 laravel/pint、spatie/phpunit-snapshot-assertions 这类包会在安装后自动执行脚本,一旦脚本出错(比如权限不足、路径不存在),Composer 可能中断并留下半残的 vendor/,导致下次 install 直接报 Permission denied 或 autoload 失败。
- 先看报错堆栈末尾有没有
post-install-cmd字样,有就基本锁定是脚本问题 - 临时禁用脚本重试:
composer install --no-scripts,装完再手动跑需要的命令(比如php artisan pint:install) - 如果脚本依赖特定目录权限,别全局
chmod -R 777 vendor/,只给目标子目录加权:chmod u+w vendor/spatie/phpunit-snapshot-assertions - Git 提交前检查
.gitignore是否误加了vendor/—— CI 拉不到完整 vendor,脚本执行环境就和本地不一致
Class not found。这时候得回退一步,用 composer dump-autoload --verbose 看它到底漏掉了哪些命名空间。










