生产环境必须用composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction,否则必然导致类加载变慢、500错误、调试入口暴露及敏感信息泄露;根本原因是composer.lock若含dev包记录,则--no-dev无效,且autoload-dev映射需通过composer dump-autoload --no-dev手动清理,docker构建还需清除vendor中tests、bin等残留。

生产环境必须用 composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction,否则线上必然出现类加载变慢、500 错误、调试入口暴露甚至敏感信息泄露——这不是概率问题,是命令漏参数直接导致的确定性故障。
为什么 composer install --no-dev 有时没效果
根本原因不是命令写错了,而是 composer.lock 文件里已经记录了 require-dev 的包。因为 composer install 只照 lock 装,不看 composer.json 里有没有 --no-dev。
- 本地执行过
composer update(没加--no-dev),lock就混入了phpunit/phpunit、symfony/var-dumper等条目 - CI 构建前没跑
composer update --no-dev --lock,新lock就没生成 - 检查方法:
grep -A5 '"packages-dev"' composer.lock | head -20,非空即风险
autoload-dev 不会自动消失,必须手动清理
--no-dev 只跳过安装,不影响 vendor/autoload.php 的生成逻辑。如果某个 require-dev 包在 composer.json 里声明了 autoload-dev(比如把 tests/ 映射进 PSR-4),那即使没装这个包,composer dump-autoload 默认仍会把它写进 autoloader。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 后果:线上 autoloader 多余扫描路径,可能引发命名冲突或
Class not found - 补救动作必须加:
composer dump-autoload --no-dev - 漏掉这步,
vendor/autoload.php里依然含tests/映射,IDE 和运行时都可能误加载
Docker 构建阶段最容易踩的三个坑
构建镜像时,最常因“省事”引入污染,导致线上行为不可控。
- 把宿主机的
vendor/直接COPY进镜像:权限错乱、PHP 版本不一致、扩展缺失直接 fatal error - 复用
~/.composer/cache:不同项目缓存混用,composer install拿到错误版本的 tarball - 构建命令漏参数:
RUN composer install是高危写法,必须显式写全:RUN COMPOSER_DEV_MODE=0 composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction - 装完不清理:
vendor/bin/、vendor/**/tests/、vendor/**/.git必须删,Linux 下可用:find vendor -name 'tests' -o -name 'Tests' -o -name 'bin' -o -name '.git' | xargs rm -rf
真正难的不是写对命令,而是让整个流程(本地开发 → CI → Docker 构建 → 部署)中,composer.lock 的内容、autoloader 的映射、镜像里的文件结构三者始终严格对齐——任何一环松动,隔离就失效。










