--no-dev 不生效的主因是 autoload 配置错误导致测试类被主 autoloader 加载,而非仅依赖安装问题;需检查 composer.json 的 autoload(非 autoload-dev)是否误含 Tests 命名空间,并配合 --optimize-autoloader 和 lock 文件状态综合排查。
为什么
有时不生效?
它只跳过
区块里的包,但如果你的
或测试类被主代码意外引用(比如
目录被
扫进去了),Composer 仍会尝试加载它们——哪怕没安装。常见于 Laravel、Symfony 项目里误配了
的
映射,把
也映射进生产 autoloader。
检查
的
(不是
)是否包含测试命名空间或路径
运行
后,用
确认 dev 包确实没列出来
如果用了
模拟低版本 PHP,某些 dev 包可能因平台约束被“降级保留”,得配合
清理
和
的区别
前者按
精确还原依赖,跳过所有
;后者会重新解析依赖树,但依然忽略
—— 这意味着:如果 lock 文件里记录了 dev 包,
能彻底跳过;而
可能因依赖传递引入新 dev 包(比如某个非 dev 包在它的
里声明了工具,但该工具又被其
间接拉进来)。
部署必须用
,不是
仅适合开发环境清理后重生成 lock,且要确认
的
字段为空
CI/CD 中建议加
先验证:
CI/CD 部署时漏掉
的典型后果
最直接的表现是:PHP 单元测试框架(如
)或代码分析工具(如
)被装进生产环境,不仅浪费磁盘和内存,更严重的是——这些包的 autoloader 可能污染生产类加载顺序,导致
错误(尤其当它们注册了同名 classmap 或 files 加载器)。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
错误现象:
出现在生产日志里,说明某处代码 runtime 引用了测试类
用
快速排查是否混入了
、
、
(带
后缀的变体)等
Docker 构建中记得在
后加
,避免 autoload 生成冗余映射
配合
才算真正优化
只控制装不装包,不控制 autoloader 性能。如果没开优化,Composer 仍会为每个 PSR-4 命名空间扫描整个目录,包括那些本该被
排除的测试文件夹。
部署前确保
有:
或者运行时加参数:
注意:
要求 APCu 扩展已启用,否则会静默失败,可用
验证
事情说清了就结束。真正的坑不在要不要加
,而在它和 autoloader 配置、lock 文件状态、甚至扩展可用性之间的耦合。
--no-devrequire-devautoload-devtests/autoloadautoloadpsr-4Tests\composer.jsonautoloadautoload-devcomposer dump-autoload --no-devcomposer show --devconfig.platform--ignore-platform-req=ext-*composer install --no-devcomposer update --no-devcomposer.lockrequire-devrequire-devinstall --no-devupdate --no-devrequire-devrequirecomposer install --no-devupdatecomposer update --no-devcomposer.lockpackages-dev--dry-runcomposer install --no-dev --dry-run--no-devphpunit/phpunitphpstan/phpstanClass not foundPHP Fatal error: Class 'PHPUnitFrameworkTestCase' not foundcomposer show --installedphpunitmockerydoctrine/orm-devRUN composer install&& composer dump-autoload --optimize --no-devconfig.optimize-autoloader--no-dev--no-devcomposer.json"config": { "optimize-autoloader": true, "apcu-autoloader": true }composer install --no-dev --optimize-autoloader --apcu-autoloader--apcu-autoloaderphp -m | grep apcu--no-dev