生产环境必须用 composer install --no-dev --optimize-autoloader --prefer-dist 三参数组合,缺一不可;因 dump-autoload -o 不触发依赖解析与 classmap 重建,易致 class not found 错误。

生产环境打包部署时,composer install 必须用 --no-dev --optimize-autoloader --prefer-dist 三参数组合,缺一不可。单独加 -o 或用 dump-autoload -o 不仅无效,还可能引入 Class not found 错误。
为什么 dump-autoload -o 在生产环境不能用
dump-autoload -o 在 Composer 2.0+ 中只是 --classmap-authoritative 的别名,它不触发依赖解析、不扫描 autoload 配置路径、也不重建 vendor/composer/autoload_classmap.php。实际生成的 classmap 常为空或漏项,运行时 fallback 到慢路径,甚至直接报错。
- 执行后
autoload_classmap.php文件体积没变大、内容稀疏或根本不存在 → 说明 classmap 根本没生成 - CI/CD 流水线里若用了这个命令,本地能跑、线上炸锅是常态
-
vendor/autoload.php里没有'classmap-authoritative' => true,就证明没生效
install 三参数必须同时出现
只有 install(或 update)阶段才会完整解析 composer.json 中所有 autoload 配置(PSR-4、classmap、files),并真正写入 classmap 文件。三个参数各自作用不可替代:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--no-dev:跳过require-dev包,避免测试类混进 classmap,否则上线后因缺少 dev 依赖导致Class not found -
--optimize-autoloader:把 PSR-4 映射转为静态 classmap 条目(前提是路径下真有类文件) -
--prefer-dist:优先下载压缩包而非源码,减少解压和 Git 操作,实测提速约 20%(见基准测试)
验证是否真优化成功
光看命令执行成功没用,得查两个硬指标:
- 打开
vendor/composer/autoload_real.php,搜索findFile方法:只保留if ($classMap = $this->classMap)分支,且完全删掉了foreach ($this->prefixesPsr4循环 - 用
strace -e trace=file php -r "new PDO();"观察系统调用:启用后应看不到大量stat("/path/to/vendor/xxx/yyy.php")失败记录 - 检查
vendor/composer/autoload_classmap.php是否包含你新增的类全名(如AppConsoleCommandsDeployCommand),而不是只搜文件名
权威模式不是“开就快”,而是“全或无”——一旦 classmap 漏掉运行时实际加载的类(比如空目录、动态生成类、autoload.files 引入的辅助文件中 new 出来的类),就会立刻报错。这点最容易被忽略,尤其在用了 "autoload-dev": {"psr-4": {"Tests\": "tests/"}} 却没加 --no-dev 的项目里。










