生产环境必须加--no-dev,否则会安装phpunit等dev依赖并触发autoload-dev映射,导致class 'tests estcase' not found;正确做法是ci阶段全量安装dev依赖,生产部署时仅执行composer install --no-dev --optimize-autoloader --no-interaction。

生产环境 composer install 报错,90% 不是命令写错了,而是默认行为和生产场景根本冲突——它试图装开发包、触发脚本、反复查文件、还依赖你本地没配好的 Git 或 xdebug。直接加 --no-dev --optimize-autoloader --no-interaction --no-scripts 就能解决绝大多数问题,但前提是你的 composer.lock 已提交且环境匹配。
为什么加 --no-dev 还报 Class 'TestsTestCase' not found
这不是参数漏了,而是 --no-dev 生效后,autoload-dev 里声明的路径(比如 "psr-4": {"Tests\": "tests/"})被完全忽略。一旦代码里有运行时引用(比如某些测试基类被误引入到服务提供者),就会直接 fatal error。
- 检查所有
use和class_exists()调用,确认没在生产逻辑里硬依赖Tests、PhpUnit或其他 dev-only 命名空间 - 运行
composer dump-autoload --no-dev后,打开vendor/composer/autoload_psr4.php,确认Tests\键已消失 - 如果项目真要用某个测试工具类(极少见),把它移到
src/下并加进autoload,而不是靠autoload-dev
部署脚本里该用 --optimize-autoloader 还是 --classmap-authoritative
--optimize-autoloader(简写 -o)生成 autoload_classmap.php,把 PSR-4 映射转成静态数组,减少 file_exists() 调用;--classmap-authoritative 更进一步,告诉 autoloader “类只可能在 classmap 里,别去 PSR-4 目录扫描”。后者性能略高,但必须确保所有类都进了 classmap——比如 files autoload 或动态 require 的文件容易漏。
- 普通 Laravel 项目用
--optimize-autoloader足够,它兼容性好,CI 构建快 - 如果你明确控制了所有类加载路径(比如不用
files,也不手动require零散文件),可以加--classmap-authoritative,但得配合composer dump-autoload -a测试 - 两者不能单独用:只开
--classmap-authoritative不生成 classmap,autoloader 会找不到任何类
卡在 “Loading composer repositories” 或 “Failed to download” 怎么办
这不是 Composer 慢,是它在拉元数据(packages.json)时被墙或 DNS 解析失败。国内镜像必须同时满足三个条件才真正生效:repo.packagist 键名、type: "composer"、URL 以 / 结尾。
- 执行
composer config -g repo.packagist,输出必须是完整 JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 清掉旧缓存:
composer clear-cache,否则 Composer 可能还在用失效的官方源缓存 - 如果服务器走代理,设
COMPOSER_HOME到可写目录,并加--no-plugins避免插件干扰(比如 prestissimo 在 PHP 8.3+ 已废弃)
能不能在生产机上直接跑 composer install
能,但不推荐。哪怕加了全部安全参数,仍存在三处不可控风险:web 用户权限不够写 vendor/、post-install-cmd 脚本意外执行 Artisan 命令、COMPOSER_HOME 默认指向 /root/.composer 却无写权限导致卡住。真正的安全部署,是在 CI 或 Docker 构建阶段跑完 composer install --no-dev --optimize-autoloader --no-interaction --prefer-dist,然后把整个 vendor/ 打包上传——连 .gitignore 漏掉的隐藏文件都一并带上,避免线上行为漂移。











