composer.json是项目依赖契约而非配置清单;require放运行必需包(如guzzlehttp/guzzle),require-dev放开发工具(如phpunit/phpunit),错放会导致class not found或安全风险。

composer.json 不是“越全越好”,写错一个字段,composer install 就可能装出完全跑不起来的环境。 它本质是一份依赖契约,不是配置清单,更不是运行时配置源。
require 和 require-dev 放错包,上线就报 Class not found 或 500
这两个字段决定哪些代码会被放进 vendor/,但不控制运行时行为——装不进去,自然用不了。
-
require只放生产环境真正调用的包,比如"guzzlehttp/guzzle": "^7.0"、"monolog/monolog": "^2.0";漏掉就会Class not found或Call to undefined function -
require-dev放开发期工具:测试("phpunit/phpunit": "^9.5")、代码规范("friendsofphp/php-cs-fixer": "^3.0")、生成器等;CI 若用了--no-dev,这些包根本不会出现在vendor/里 - 某些包(如
symfony/console)是否进require,取决于你是否在生产环境执行命令行逻辑,而不是它“带 console 字样” - 别把
phpunit塞进require—— 它只在测试时 require,上线后不仅白装,还可能引入安全风险
autoload 配错一个反斜杠,自动加载就静默失效
PSR-4 映射不是“大概对就行”,Composer 不会报错,只会跳过加载。命名空间、路径、结尾反斜杠、大小写必须严丝合缝。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 写成
"psr-4": {"App\": "src/"},要求:src/Http/Controller.php文件首行必须是namespace AppHttp;(注意末尾;和开头双反斜杠) - 漏掉
(写成"App": "src/")、写成app或App/,都会导致类找不到 - 改完
autoload后,必须手动运行composer dump-autoload,否则缓存还是旧的 - 老项目或函数文件可用
"classmap": ["lib/", "helpers/"],但增删文件后也得重跑dump-autoload -
classmap优先级高于psr-4,同名类同时存在时,会加载classmap指向的那个
minimum-stability 和 prefer-stable 不设,composer update 可能悄悄装 dev 版本
默认情况下,composer require some/package 可能拉取 v3.0.0-beta2,上线前才发现严重 bug。
-
"minimum-stability": "stable"是底线:除非显式写"some/package": "dev-main",否则绝不装beta、alpha、dev版本 -
"prefer-stable": true是保险绳:即使某包最新版是dev-master,也会优先选最近的stable版(如2.8.1) - 注意:
require中某条带@dev的写法(如"some/package": "^2.0@dev")会覆盖全局minimum-stability,这种“后门”用grep "@dev" composer.json能快速扫出 -
platform字段必须和require同级,"config": {"platform": {...}}写法在 Composer v2+ 中完全无效
scripts 不是部署脚本容器,post-install-cmd 不该写 sh 脚本
scripts 字段只是命令别名,适合封装常用命令(如 "test": "phpunit"),但不适合放部署逻辑。
- 部署脚本应独立于
composer.json,用 Makefile、shell 脚本或 CI pipeline 管理 -
post-install-cmd或post-update-cmd执行失败,会导致composer install整体失败,但这类钩子无法可靠处理权限、环境变量、多步依赖等真实部署问题 - 若真要用,只放轻量、幂等操作,例如
"post-install-cmd": ["@php artisan optimize:clear"],避免调用外部 shell 或长时任务 - CI 中建议统一用
composer install --no-dev --prefer-dist,避免本地vendor/状态污染判断
最常被忽略的一点:项目已有 composer.lock 时,仅修改 require 后运行 composer install,它会按 lock 文件还原,**完全忽略你新加的包**;此时必须用 composer update vendor/package-name,或删 lock 后再 install。










