生产环境必须加--no-dev,否则phpunit、infection等dev包必入vendor,引发安全风险与性能下降;还需配合--optimize-autoloader、--classmap-authoritative和--no-interaction三参数缺一不可。

composer install 必须加 --no-dev 才算生产安装
不加 --no-dev,phpunit、infection、phpstan 这类开发工具会一并打进 vendor,不仅增大部署包体积,更可能因未审计的远程调用或调试接口引入安全风险。CI 脚本里写 composer install 却没这个参数,等于把测试环境直接推上生产。
-
--no-dev不是“可选优化”,而是生产构建的准入门槛:它跳过require-dev下所有包,且会禁用post-install-cmd中依赖 dev 包的脚本(比如某些清理缓存的命令) - 若项目需在 CI 中跑测试,应拆成两个阶段:先用
--no-dev构建生产包;再单独用--with-all-dependencies或显式--dev安装测试依赖,避免混用 - GitHub Actions / GitLab CI 的 job 环境变量
COMPOSER_DEV_MODE=0并不能替代该参数——它只影响部分内部逻辑,不改变依赖安装行为
三个性能参数缺一不可:--optimize-autoloader 和 --classmap-authoritative
只加 --no-dev 还远远不够。Laravel/Symfony 项目实测,漏掉其中任一,autoload 性能下降 30%~50%,线上还容易报 Class not found——尤其在 OPcache 开启但未预热时。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--optimize-autoloader生成vendor/composer/autoload_classmap.php,让类加载从“扫描目录”变成“查表”,绕过 PSR-4 文件系统遍历 -
--classmap-authoritative必须和上一个参数配合使用:它告诉 autoloader “classmap 之外绝对没有类”,彻底关闭 fallback 到文件系统查找的机制——这是防止运行时报错的最后一道防线 - 这两个参数在本地开发一般不加,因为会增加 install 时间;但在 CI 中,构建产物要直接上线,必须启用
--no-interaction 是 CI 脚本能跑通的前提
CI 环境没有终端交互能力,而 Composer 在凭证缺失、权限不足或依赖冲突时默认会停住等待输入。一旦卡住,60 分钟超时后被平台杀掉,日志只剩一行 Killed 或空转痕迹。
- 必须显式加
--no-interaction,不能依赖COMPOSER_NO_INTERACTION=1环境变量(旧版 Composer 对该变量支持不一致) - 建议配套加
--no-progress:禁用 ANSI 进度条,防止控制字符污染日志,干扰后续解析(比如 CI 日志提取失败关键词) - 若项目用私有仓库,需提前注入
COMPOSER_AUTH环境变量,否则--no-interaction会让认证失败直接退出,而不是提示重试
缓存 ~/.composer/cache,别缓存 vendor/
缓存 vendor/ 看似省时间,实则埋雷:不同 PHP 版本、不同扩展(如 ext-zip 是否启用)、甚至不同平台(Linux vs Alpine)生成的 autoload 文件不兼容,会导致随机 Cannot declare class 或 Class not found。
- 真正该缓存的是
~/.composer/cache(Linux/macOS)或%APPDATA%\Composer\cache(Windows):它只存下载的 zip 包和 dist 文件,与运行环境无关 - GitHub Actions 推荐用
actions/cache@v3,key 设为composer-${{ hashFiles('**/composer.lock') }},精准绑定 lock 文件哈希 - 若用 Docker 构建,应在
Dockerfile中分层:先COPY composer.json composer.lock .,再RUN composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction,最后才COPY . .
php -r "require 'vendor/autoload.php'; echo 'OK';",确认 autoloader 真的能载入——很多问题只在第一次请求时暴露,CI 里不验,上线就跪。










