执行 composer remove 后 vendor 仍有残留,主因是未清除自动加载缓存或 composer.json 引用未同步更新;需确认已删包名、运行 dump-autoload -o、检查 autoload_*.php 并排查依赖链。

composer remove 之后为什么 vendor 还有残留
执行 composer remove vendor/package-name 后,如果发现 vendor/ 目录下对应包的文件还在,或者 autoload_psr4.php 里仍有它的命名空间映射,说明卸载没真正完成。常见原因是没清掉自动加载缓存或存在手动修改过的 composer.json 引用残留。
- 先确认是否真的从
composer.json的require或require-dev中删掉了该包 —— 手动编辑过composer.json却忘了运行composer install或composer update,会导致状态不一致 - 运行
composer dump-autoload -o强制重建自动加载映射,否则旧的 PSR-4 映射可能还生效 - 检查
vendor/composer/autoload_*.php文件,确认目标包的路径和命名空间已消失;若还在,说明composer remove没触发成功(比如包名拼错、大小写不符) - 极少数情况是该包被其他已安装包依赖,
composer remove会拒绝操作,此时需加--with-dependencies或先查依赖链:composer depends vendor/package-name
composer unused 能不能准确识别“无用库”
composer-unused 是第三方工具,不是 Composer 内置命令,它通过静态扫描代码中 use、new、class_exists 等调用点来推测依赖是否被使用。但它无法覆盖所有场景,误报/漏报很常见。
- 动态加载类(如
class_alias、__autoload、spl_autoload_register)、反射调用(ReflectionClass)、字符串拼接类名($class = 'Some\' . $suffix)都会被漏掉 - 测试代码(
tests/)默认不扫描,但有些包只在 PHPUnit 中用到,会被误判为“无用” - 配置驱动的扩展(如 Laravel 的 Service Provider、Symfony 的 bundle)通常不直接写
new,composer-unused基本识别不了 - 建议配合
grep -r "Vendor\Package" app/ src/ --include="*.php"手动验证关键包,比全信工具更可靠
composer install --no-dev 在 CI 和线上环境必须加吗
必须加,而且要确保 composer.lock 里没有 dev-only 包混入生产依赖树。不加会导致线上多装一堆测试、调试、开发专用库(比如 phpunit、symfony/debug-bundle),既增大部署体积,又可能引入安全风险或 autoload 冲突。
-
--no-dev不仅跳过require-dev,还会让 Composer 忽略所有 dev-only 的依赖传递链 —— 但前提是composer.lock是用--no-dev生成的;如果本地composer install没带这个参数,lock文件里就可能锁定了 dev 包 - CI 流水线中推荐固定用:
composer install --no-interaction --no-progress --no-suggest --no-dev --optimize-autoloader,其中--optimize-autoloader会生成 classmap 提升性能 - 检查是否真生效:部署后进
vendor/目录,ls | grep -E "(phpunit|debug|faker|mockery)"应为空;再看composer show --dev输出应为 “No dependencies.”
autoload 优化:psr-4 vs classmap 性能差异在哪
PSR-4 是按命名空间映射路径,每次 new 类都要做一次文件系统查找;classmap 是提前把所有类路径打成数组,require 时直接查表,快得多。但 classmap 不支持动态增删类,维护成本高。
- 对稳定、不常改的目录(如
app/、src/),用"psr-4": {"App\": "app/"}足够清晰且可维护 - 对大量小工具类、枚举、数据传输对象(DTO)等“只读不改”的目录,可以单独加进
classmap:"classmap": ["app/Support/", "app/Enums/"],然后运行composer dump-autoload -o - 注意:一旦用了
-o(optimize),Composer 就会合并 psr-4 + classmap + files 到一个 classmap 数组里,所以不是非此即彼,而是分层叠加 - 别盲目 classmap 全项目:如果
src/下每天都有新类提交,每次composer dump-autoload -o都要全量扫描,CI 时间明显拉长










