composer remove 不能替代 --no-dev,因其仅删除显式声明的包,不清理 composer.lock 中的 dev 传递依赖、不移除 autoload-dev 映射,也无法切断 dev 依赖链;而 --no-dev 在 install 阶段过滤整个 require-dev 区块,但需 composer.lock 健全、无环境变量覆盖、且不可与 update 混用。

生产环境 vendor 体积暴涨,八成是因为 dev 组件没被真正剔除——composer remove 和 composer install --no-dev 解决的是不同层面的问题,混用或只做其一都会留坑。
为什么 composer remove 不能替代 --no-dev
前者删的是你主动声明的包(比如 phpunit/phpunit),后者跳过整个 require-dev 区块及其顶层依赖。但关键点在于:composer remove 不影响 composer.lock 中已记录的 dev 包传递依赖;而 --no-dev 在 install 阶段才决定“要不要拉下来”。
- 你用
composer remove phpunit/phpunit,但roave/security-advisories仍留在composer.lock的 dev 块里 → 下次composer install(没加--no-dev)它照常进来 -
composer remove不会动autoload-dev映射,哪怕包删了,测试类路径还挂在 autoloader 里(虽不触发,但冗余) - 某些包(如
laravel/pint)本身是 dev-only,但被其他 dev 包间接 require,remove单个包无法切断整条链
composer install --no-dev 实际生效的三个前提
这个参数不是“开关”,而是有条件触发的过滤动作。它只在满足以下全部条件时才真正起效:
-
composer.lock文件存在且未被破坏(composer update --lock可修复) - 没有通过
COMPOSER_NO_DEV=0或类似环境变量显式覆盖 - Dockerfile 或 CI 脚本中没在
composer install前执行composer update—— 后者默认带 dev,会把 dev 包重新写进 lock
常见误操作:RUN composer update && composer install --no-dev,结果前一步已经把 dev 包载入 lock,后一步只是白做。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
删完 dev 包后,vendor 还大?重点查这三处
即使 --no-dev 生效、composer remove 执行干净,vendor 仍可能臃肿,问题往往藏在包内部结构里:
- 某包的
composer.json在autoload里写了"psr-4": {"Tests\": "tests/"}—— 它没进require-dev,但 tests/ 目录仍被下载并纳入自动加载扫描范围 -
vendor/symfony/console下的Resources/doc/和bin/是源码附带内容,--no-dev不管这些,得靠--classmap-authoritative+dump-autoload -o触发裁剪 - 私有包用了
"type": "package"且只配了source没配dist→composer install --prefer-dist --no-dev会静默 fallback 到 source 模式,.git 目录全量下载
真正安全的清理流程:先锁死,再裁剪,最后验证
别信“删一个包就完事”。线上部署前必须走通这条链:
- 运行
composer install --no-dev --optimize-autoloader --classmap-authoritative(不是update) - 检查
vendor/composer/installed.json,搜索"dev-或"source"字样,确认无残留分支名或 source 类型条目 - 执行
du -sh vendor/* | sort -hr | head -5,进最大几个目录看有没有tests/、.git/、docs/ - 用
composer show --dev输出为空,且composer show vendor/package-name查不到任何已被移除的包
最易被忽略的点:autoload classmap 文件不会自动更新,除非你明确跑 dump-autoload;而有些 Docker 构建环境缓存了旧的 autoload_classmap.php,导致删掉的类还能 new 出来——这不是 bug,是缓存没清干净。










