必须用 composer install --no-dev,且前提是 composer.lock 已提交、未被忽略、内容纯净——缺一不可。因为 composer install 仅按 lock 文件安装,若 lock 缺失、被忽略或含 dev 包,即使加 --no-dev 仍会失效;不加该参数则 phpunit 等开发依赖必入 vendor,引发安全、性能与 autoload 冲突;还需组合 --optimize-autoloader 和 --classmap-authoritative 才能真正启用高效权威加载。

必须用 composer install --no-dev,且前提是 composer.lock 已提交、未被忽略、内容纯净——缺一不可。
为什么 composer install 本身不等于安全
很多人以为只要用了 composer install 就万事大吉,其实不是。它只保证“按 lock 装”,但不保证“装得对”。常见失效场景包括:
-
composer.lock没提交到 Git,或被.gitignore错误屏蔽,导致别人 clone 后运行composer install实际走的是composer.json的模糊约束 -
composer.lock里混着旧版require-dev包(比如你上周在本地跑过composer update,但没清理 lock),即使加了--no-dev,Composer 仍可能因依赖冲突降级主包 - CI 环境缓存了旧的
composer.lock或 vendor 目录,跳过重新拉取,直接复用脏数据
--no-dev 不是可选项,是生产环境硬性开关
不加 --no-dev,phpunit、laravel/pint、symfony/var-dumper 全都会进 vendor/。这不是“多几个文件”的事:
- 某些包会注册全局服务提供者(如
barryvdh/laravel-debugbar),哪怕没启用,autoload 时也可能触发 class_exists 判断失败 -
roave/security-advisories这类 dev-only 包若被装进生产环境,会导致 composer install 直接报错退出(它本质是“阻止安装已知有漏洞的版本”) - PHP 扩展缺失(如
ext-intl)时,dev 包常比 runtime 包更早暴露 fatal error
配套参数一个都不能少
光靠 --no-dev 还不够。生产环境要真正稳定,必须组合使用:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--optimize-autoloader:生成vendor/autoload.php的扁平 classmap,避免每次请求都遍历 PSR-4 目录 -
--classmap-authoritative:告诉 autoloader “所有类都在 classmap 里,别去文件系统猜了”,这是性能关键 -
--no-interaction:防止 CI 或 Docker 构建卡在交互式提示(比如问你是否信任某个私有源) -
--prefer-dist:优先下载 zip 包而非 git clone,减少网络和磁盘开销
推荐完整命令:composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction --prefer-dist
最容易被忽略的平台一致性
composer.lock 记录的是“哪个版本”,但不记录“它能不能在你的 PHP 版本上跑”。如果你本地用 PHP 8.2,CI 用 PHP 8.1,而某个包在 8.2 上才支持的新语法进了 lock,部署就会失败。
解决办法只有两个:
- 在
composer.json根级config下写死"platform": {"php": "8.1.10"}(注意:必须精确到小版本,"8.1"或"^8.1"无效) - 改完后删掉
vendor/和composer.lock,再跑一次composer install—— 旧 lock 不会自动重算 platform 兼容性
跨环境部署前,先确认 PHP 版本、扩展(如 ext-gd、ext-mbstring)和 config.platform 三者严格匹配,否则 composer install 成功也不代表能跑起来。

















