清空 composer 依赖需先清空 composer.json 的 require 和 require-dev 内容,再删 vendor 和 composer.lock;仅删文件不等于重置,因依赖关系由 composer.json 定义。

直接删 vendor 和 composer.lock 不等于清空依赖
很多人以为删掉 vendor 目录和 composer.lock 就算“重置”了,其实不是。Composer 的依赖关系记录在 composer.json 里,只要它还在,下次 composer install 或 composer update 就会照着装回去。
真正清空,得先清掉 composer.json 里的 require 和 require-dev 列表内容,再删文件。
- 删之前建议备份
composer.json,比如cp composer.json composer.json.bak - 清空后运行
composer install会报错(因为没包可装),这是预期行为 - 如果只是想临时测试干净环境,用
composer create-project --no-install xxx更安全,不污染原项目
composer remove 不支持通配符,批量删得写脚本
composer remove 只接受具体包名,不能用 * 或正则。想批量删,得从 composer.lock 或 composer.json 里提取包名再循环执行。
比如删所有非官方源的包(排除 php、ext-* 等虚拟包):
jq -r '.packages[] | select(.name | startswith("vendor/") or startswith("monolog/")) | .name' composer.lock | xargs -r composer remove
-
jq是必需的,没装的话先brew install jq(macOS)或apt install jq(Ubuntu) - 注意
composer remove会自动更新composer.lock,但不会删vendor/里残留的文件——遇到删不干净,手动rm -rf vendor/vendorname - 别对
require-dev包盲目全删,像phpunit/phpunit这类可能被脚本隐式调用,删完跑测试会直接失败
用 composer update --with-dependencies 清依赖链容易误伤
有人想“降级清空”,就用 composer update xxx --with-dependencies 把某个包连带依赖全踢掉。这方法危险:Composer 会按依赖图反向推导,可能顺手把 symfony/console 这种基础包也干掉,导致 composer 命令本身无法运行。
- 更稳妥的做法是先
composer depends xxx看谁在用它,再决定是否删 -
composer show --tree能看到完整依赖树,比盲删靠谱得多 - 如果只是想换源或切版本,改
repositories或platform配置比删包更轻量
CI/CD 里重置依赖,别信 composer install --no-scripts
有些 CI 脚本加了 --no-scripts 想跳过 post-install-cmd,结果发现 vendor/autoload.php 加载异常。这是因为某些包(比如 laravel/framework)的 autoloader 生成逻辑藏在脚本里,跳过会导致后续 require 失败。
- 真要干净重建,推荐组合命令:
rm -rf vendor composer.lock && composer install - CI 中如果用缓存,记得同时清除
~/.composer/cache,否则旧包可能被复用 - Docker 构建时,
composer install前加composer clear-cache能避免镜像层缓存污染
composer.json 里隐藏的 replace、provide 和 conflict 字段——它们不显式列在 require 里,但会影响安装行为。删包前扫一眼这些字段,能少踩一半坑。










