composer install --no-dev 未删除 vendor/phpunit 是因为它只跳过安装 require-dev 声明的包,不清理已存在的 vendor 文件;必须先清空 vendor/ 并确保 composer.lock 不含 dev 包,再执行该命令。

composer install --no-dev 为什么没删掉 vendor/phpunit
因为 --no-dev 只跳过 require-dev 里声明的包,不清理已存在的文件。如果你之前装过 phpunit/phpunit,又没清空 vendor/ 直接再跑 install --no-dev,Composer 不会主动删除它——它只按 composer.lock 安装缺失项,不会“卸载”。
常见错误现象:ls vendor/ | grep phpunit 还有输出;composer show --dev 提示 “No dependencies installed for development”,但物理目录还在。
- 必须先删
vendor/(或至少删vendor/phpunit),再执行composer install --no-dev - 确保
composer.lock本身不含 dev 包:打开文件搜"phpunit"或"phpstan",确认没出现在"packages"或"packages-dev"里 -
--no-dev不影响已下载的 dist 包内容,只控制是否安装——测试文件是否在vendor/里,取决于包作者是否用.gitattributes或archive.exclude排除
想排除某个特定测试包(比如 mockery),但保留其他 dev 依赖
Composer 没有 --exclude mockery/mockery 这种语法,install 命令根本不支持按包名过滤。所谓“排除单个包”,只能靠间接手段。
真正可行的方式只有两种:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把目标包从
require-dev移到conflict:加"conflict": { "mockery/mockery": "*" },这样 Composer 解析依赖时会直接报错,阻止其被任何路径引入 - 用
replace静默覆盖:加"replace": { "mockery/mockery": "*" },告诉 Composer “这个包我当它不存在”,它就不会尝试安装(但要注意这可能破坏依赖兼容性) - 别指望
--no-dev能“部分生效”——它要么全开,要么全关
镜像地址和 --no-dev 完全无关
COMPOSER_MIRROR 环境变量无效,Composer 根本不识别它。镜像只是加速下载,不影响哪些包被安装、是否跳过测试依赖。
正确设置镜像的唯一方式是:
composer config -g repo.packagist https://mirrors.aliyun.com/composer/- 或者项目级配置:
composer config repo.packagist https://packagist.phpcomposer.com - 镜像地址写错、没生效,只会导致下载慢或超时,绝不会让
--no-dev失效或误装测试包
autoload-dev 残留比包本身更危险
即使 vendor/phpunit 物理目录被删干净,只要 composer.json 里还留着 autoload-dev 块,运行 composer dump-autoload 就会把 tests/ 路径写进 vendor/composer/autoload_static.php。
后果是:class_exists('TestsFooTest') 返回 true,但实际类文件根本不存在,运行时才报错。
- 生产环境部署前,删掉
composer.json中整个"autoload-dev"段,再跑composer dump-autoload --no-dev - 检查
vendor/composer/autoload_static.php,确认里面没有"tests/"或"Tests/"字样 - Laravel 用户注意:
phpunit.xml可能引用了autoload-dev的命名空间,删之前先验证本地测试是否还能跑
composer.lock 是否干净、autoload_static.php 是否残留、vendor/ 是否真被清空——三者缺一不可。










