Composer 在 Laravel/Symfony 中决定依赖隔离与环境一致性;必须用 composer install --no-dev --optimize-autoloader 部署,禁止生产环境 update;autoload 与 autoload-dev 命名空间不可重叠;dev 包须确为纯开发用途;私有包不得定义稳定性策略;scripts 钩子需注意 install 不自动触发 dump-autoload。

在 Laravel 或 Symfony 项目中,composer 不只是装包工具,它直接决定依赖隔离性、部署稳定性、本地与生产行为一致性。用错方式,轻则 composer install 在 CI 失败,重则线上报 Class not found 或版本冲突。
只在项目根目录运行 composer install,禁止 composer update 上生产
composer install 严格按 composer.lock 安装,确保所有环境版本一致;composer update 会忽略 lock 文件,升级到最新兼容版本——这在生产环境是高危操作。
- CI/CD 流水线必须用
composer install --no-dev --optimize-autoloader,跳过开发依赖并生成高效 autoloader - 本地开发如需更新依赖,先
git commit当前composer.lock,再composer update vendor/package-name(指定包),避免全量漂移 - 若误删了
composer.lock,不要直接composer install—— 先git checkout -- composer.lock恢复,再安装
autoload-dev 和 psr-4 的路径不能重叠
Laravel/Symfony 默认把 tests/ 加进 autoload-dev,但若同时在 autoload.psr-4 里也映射了 Tests\ 命名空间,会导致测试类在生产环境也被加载,触发未定义类或配置错误。
{
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
}
}- 检查
composer.json中autoload和autoload-dev的命名空间是否重复声明 - 运行
composer dump-autoload --no-dev后,用php -m | grep composer验证是否还存在测试类的自动加载路径 - Symfony 项目尤其注意:Bundle 的
Tests/目录不应出现在主项目的autoload.psr-4
避免在 require-dev 中放运行时必需的包
有些包看似是“开发用”,实则运行时依赖,比如 symfony/debug-bundle 在 dev 环境启用,但若 APP_ENV=dev 且未正确条件加载,会直接导致启动失败;更常见的是 barryvdh/laravel-debugbar 被误装进 require-dev,结果线上 APP_DEBUG=true 时找不到类。
- 判断标准:该包是否在
config/或bootstrap/app.php(Laravel)/config/bundles.php(Symfony)中被无条件引用?若是,必须进require - 运行
composer show --dev列出所有 dev 包,逐个确认是否真只用于本地调试或测试 - 部署前执行
composer install --no-dev后,用php artisan config:clear(Laravel)或php bin/console cache:clear(Symfony)验证是否仍能启动
自定义包发布时,别让 composer.json 污染主项目
如果你维护一个私有 Laravel 包(比如 acme/laravel-analytics),它的 composer.json 若含 "minimum-stability": "dev" 或 "prefer-stable": true,会被 Composer 合并进主项目策略,导致主项目意外降级稳定版本。
- 私有包的
composer.json应只声明name、autoload、require(运行时依赖)、require-dev(仅测试用),不设 stability 相关字段 - 主项目统一控制稳定性策略:在根
composer.json中显式写"minimum-stability": "stable"和"prefer-stable": true - 使用
composer validate检查包的composer.json是否符合 Packagist 规范(无多余字段)
最常被忽略的一点:Composer 的 scripts 钩子(比如 post-autoload-dump)在 install 和 update 时行为不同——install 不会重新生成 autoload,除非 lock 文件有变更。这意味着你改了 autoload 配置却没碰依赖,composer install 不会生效,得手动 composer dump-autoload。










