生产环境必须用 composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction --prefer-dist,缺一不可;否则将导致类加载变慢数倍、偶发 Class not found、镜像体积暴涨及调试接口暴露等严重问题。

生产环境必须用 composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction --prefer-dist,少一个参数就可能类加载变慢、报 Class not found、镜像体积暴涨或暴露调试入口。
require-dev 是唯一合法的开发依赖声明位置
所有仅用于本地开发、测试、CI 构建的包(如 phpunit/phpunit、phpstan/phpstan、mockery/mockery)必须写进 composer.json 的 require-dev 字段。这不是“建议”,而是 Composer 唯一原生支持的隔离机制。
-
composer require -D phpunit/phpunit是安全写法,兼容所有 Composer 版本;composer require --dev phpunit/phpunit在 Composer ≥ 2.2 才可靠 - 不要在
require里写开发包,哪怕加了--no-dev也拦不住——它只跳过require-dev,不处理require里的误配 - 如果某个包在开发时需高版本、生产时需低版本,不能靠环境变量切换,应统一版本或拆成两个独立包(如
myapp/debug-tools和myapp/runtime-core)
--no-dev 不等于“没装就安全”,它只控制安装不控制引用
--no-dev 只跳过 require-dev 中声明的顶层包及其 autoload-dev 映射,但不会阻止你代码里硬编码调用这些类。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 现象:
Class 'PHPUnitFrameworkTestCase' not found,即使没装 PHPUnit —— 因为某处写了class_exists('PHPUnitFrameworkTestCase'),PHP 尝试 autoload 导致失败 - 更隐蔽的问题:某些包(如
symfony/var-dumper)被放进require-dev,但控制器里直接调用了dump($data),线上 debug 模式一开就 500 - 检查方式:
grep -r "PHPUnit\|Mockery\|PhpCsFixer" src/,确保src/下无直接use或new;autoload-dev路径(如"Tests\")也不应覆盖任何会被生产请求访问的目录
CI/CD 和 Docker 构建中三个不可省略的动作
光写 --no-dev 不够,漏掉任一环节都会让精简失效。
- 构建前先跑
composer update --no-dev --lock,强制刷新composer.lock,确保它不含 dev 包记录;然后提交新 lock 文件 - Dockerfile 中必须严格按顺序:先
COPY composer.json composer.lock ./,再立刻RUN composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction --prefer-dist - CI 缓存 key 必须带语义,例如
composer-${{ hashFiles('**/composer.lock') }}--no-dev,否则缓存复用可能把旧版 dev 包混进来
装完还得手动删 vendor 里不该留的东西
--no-dev 只跳过安装,不清理残留。vendor/ 里大量文件虽不运行,但会增大镜像、暴露结构、甚至被恶意利用。
- 必须删除:
vendor/bin/(除非明确需要phinx等在线上执行)、vendor/**/tests/、vendor/**/docs/、vendor/**/examples/、vendor/**/.git、vendor/composer/installed.json - Linux/macOS 下推荐命令:
find vendor -path '*/tests' -o -path '*/.git' -o -name 'phpunit.xml' -o -name 'psalm.xml' -delete - 特别注意:
vendor/composer/autoload_static.php和autoload_classmap.php里不能有Tests或Factories开头的映射项;若有,说明--no-dev没生效或dump-autoload被误执行过
真正容易被忽略的是:classmap 是否完整、autoload_static.php 是否干净、以及代码里有没有对 dev 类的隐式依赖——这些不会在本地报错,但上线后第一波请求就可能崩。

















