composer install --no-dev是生产部署硬性前置条件,必须显式添加,否则vendor中必然混入phpunit、mockery等dev包;其生效前提是composer.lock不含packages-dev且无dev包记录,否则报错或失效。

composer install --no-dev 不是可选,是必须加的参数
不加 --no-dev 就执行 composer install,生产环境 vendor 里一定会出现 phpunit/phpunit、mockery/mockery、symfony/debug-bundle 这类包——这不是概率问题,是 Composer 的默认行为决定的。它只认 composer.lock 里的 packages 和 packages-dev 两块,不看 APP_ENV,也不管你本地有没有 xdebug。
常见误操作包括:
- CI 脚本里只写
composer install,漏掉--no-dev - 以为删掉
composer.json里的require-dev就安全了,但composer.lock还存着旧记录,install 照装 - 先跑了一次没带参数的 install,再补
--no-dev,已装的phpunit不会自动卸载
--no-dev 生效的前提:composer.lock 必须“干净”
--no-dev 只在 composer.lock 文件本身不含 packages-dev 条目时才顺利执行;如果 lock 文件里已有 phpunit/phpunit 的 dist 记录,composer install --no-dev 会直接报错:"dev dependencies not found"。
首次上线或 CI 构建前,必须在干净环境(无 vendor/、无 composer.lock)下运行:
composer update --no-dev --lock- 提交新生成的
composer.lock - 部署时再跑
composer install --no-dev --optimize-autoloader
验证 lock 是否干净:打开 composer.lock,搜索 "packages-dev": [,确认该区块为空;再全局搜 "phpunit"、"mockery"、"symfony/debug",应无匹配。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
Docker 构建中 --no-dev 容易被缓存绕过
Docker 构建层缓存会让 RUN composer install --no-dev 看似生效,实则复用了上一次含 dev 包的 layer。结果是 vendor/ 里悄悄混入 php-cs-fixer 或 symfony/var-dumper。
可靠做法是强制清缓存再装:
RUN rm -rf vendor/ && composer install --no-dev --optimize-autoloader --no-scripts --prefer-dist- 或在构建前加
git clean -xffd vendor/ && rm -f composer.lock(CI 脚本中)
别依赖 COMPOSER_NO_DEV=1:Composer 2.2+ 已弃用该变量,行为不稳定,且会被命令行显式参数覆盖。
部署后必须手动验证,不能只信命令输出
命令行显示 Installing dependencies from lock file 并不等于成功。得进容器或服务器看真实结果:
-
ls vendor/ | grep -E "phpunit|mockery|symfony/debug"—— 输出应为空 -
composer show --dev—— 应提示"No dependencies installed for development"或直接报错"Command 'show' is not defined" - 检查
vendor/autoload.php是否包含对vendor/composer/autoload_dev.php的require调用;该文件本身也应不存在
最常被忽略的是 autoload-dev 路径映射残留:即使 --no-dev 成功跳过了包安装,autoload-dev 里的 PSR-4 规则(如 "Tests\": "tests/")仍可能被写入 vendor/autoload.php,导致 class_exists('TestsFooTest') 返回 true,但实际类文件根本没装——这种隐性污染比报错更危险。










