本地开发用 composer install 安装全量依赖并启用 autoload-dev,测试/生产环境必须加 --no-dev 且共享同一 composer.lock 文件,否则易因 autoload 或依赖不一致导致 class not found 等问题。

本地环境默认装全量依赖
本地开发时直接运行 composer install,Composer 会安装 require 和 require-dev 里的所有包,并注册 autoload-dev 规则。这是为了支持调试、测试、代码检查等完整开发流程。
常见错误现象:本地跑得好,上线就报 Class not found,原因往往是某个类(比如 Tests\FooTest)被硬编码引用,而该类只在 autoload-dev 中注册,生产环境没装 require-dev 包,也没生成对应 autoload 映射。
- 不加任何参数 = 安装全部依赖 + 启用全部 autoload 规则
- 如果项目用了
symfony/var-dumper并在控制器里写了dump($data),它就不是纯 dev 依赖——哪怕放在require-dev里也会崩 -
composer show --dev可列出当前已安装的 dev 包,配合grep -r "vendor/name" src/能验证是否被主逻辑间接引用
测试环境必须显式跳过 dev 依赖
测试环境(如 CI/CD 流水线或预发布服务器)应视同生产环境对待:它不执行单元测试、不跑代码检查,也不需要调试工具。因此必须加 --no-dev,否则会把 phpunit、phpstan、laravel/pint 等打进镜像,带来体积膨胀、内存占用升高、甚至暴露调试入口的风险。
容易踩的坑是 Docker 构建脚本里漏掉这个参数,或者误以为 COMPOSER_DEV_MODE=0 能替代它——后者行为不稳定,尤其在多层构建中常被覆盖,--no-dev 才是唯一可靠命令级开关。
-
composer install --no-dev:跳过require-dev包安装,且不生成它们的 autoload 规则 - 搭配
--optimize-autoloader可减少自动加载开销,提升启动速度 - CI 脚本中建议固定写法:
composer install --no-dev --optimize-autoloader --prefer-dist
两者都依赖同一份 composer.lock
无论本地还是测试环境,只要执行 composer install,就必须基于同一个 composer.lock 文件。这个文件必须提交进 Git,且不能拆分成多个环境专用版本——硬拆 composer.json 或伪造不同 lock 文件,会导致依赖树不一致,引发“本地能跑、测试环境报错”的典型问题。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
关键点在于:Composer 不感知环境变量(如 APP_ENV),它只认命令参数和 lock 文件内容。所谓“环境差异”,全是靠参数控制的,不是靠配置文件切换的。
- 团队协作前提:所有人共享同一份
composer.lock,且每次composer update后必须提交它 - 若测试环境执行了
composer update但没提交新 lock,其他成员再install就会还原到旧版本,造成环境漂移 -
composer install在有 lock 文件时完全不读composer.json的版本约束,只照单下载
Windows 和 Linux 下的 install 行为其实一样
Composer 本身不区分操作系统,所谓“Windows 上 install 失败”,99% 是某个依赖在 require 里声明了 ext-posix 或 ext-pcntl 这类 Unix-only 扩展。Linux/macOS 能装,Windows 直接拒绝解析依赖树。
这不是 install 命令的问题,而是依赖声明不合理。解决方式不是换命令,而是调整依赖策略:
- 定位问题包:
composer show --tree | grep posix - 若只是开发时用(比如本地跑测试),移到
require-dev - 若必须运行,改代码用
function_exists('posix_getpid')做运行时判断 -
--ignore-platform-req=ext-posix是临时绕过手段,切勿用于 CI 或提交 lock 文件
真正容易被忽略的是:config.platform 只影响 update,对 install 完全无效——你得先在目标平台执行 update 生成适配的 lock,才能让后续 install 正常工作。










