本地包改代码后vendor未更新,因Composer仅在composer update时重建链接;需手动删除vendor子目录、执行composer update --no-cache、再dump-autoload,且本地包composer.json须配置"options":{"symlink":true}并完成git init和首次提交。

本地包改了代码,为什么 vendor 里没变?
因为 Composer 默认不监听源码变化,它只在 composer update 时重新解析和建立链接。哪怕你用了 path 类型仓库,只要没触发更新,vendor/ 下的文件就永远是上次建立 symlink 或 copy 时的状态。
- Linux/macOS 下
ls -la vendor/vendor/name看不到->指向,说明 fallback 到了复制模式,改源码无效 - Windows 下
dir vendor\vendor\name不显示,而是普通目录,同理失效 - 即使看到 symlink,类也没加载——大概率是
autoload没刷新,不是包没装上
必须跑的三步命令(缺一不可)
改完本地包代码后,不能只改、不通知 Composer。要让它“重读 + 重建链接 + 重生成自动加载器”:
- 删掉对应包的 vendor 子目录:
rm -rf vendor/vendor/name(Linux/macOS)或rd /s /q vendor\vendor\name(Windows) - 强制更新该包(跳过缓存):
composer update vendor/name --no-cache - 刷新自动加载:
composer dump-autoload(加--dev如果改了测试类)
为什么 composer clear-cache 常常没用?
composer clear-cache 只清 ~/.composer/cache/files/ 和部分元数据索引,但它完全不碰这三处:
-
vendor/下已存在的 symlink 或复制体 -
~/.composer/cache/vcs/里的 Git clone 快照(path 包也会被缓存 Git 元数据) -
vendor/composer/autoload_*.php文件本身(dump-autoload才管这个)
所以真要彻底清理,得手动删 ~/.composer/cache/vcs/*(Linux/macOS)或对应 Windows 路径,再配合上面三步。
最容易被忽略的 symlink 条件
很多人配了 "type": "path" 就以为万事大吉,但 symlink 实际是否启用,取决于本地包自己的 composer.json:
- 必须在本地包根目录的
composer.json里写:"options": {"symlink": true} - 主项目
composer.json的repositories里写不写"options"没用,那是给其他类型仓库用的 - 本地包没
git init+ 至少一个commit,Composer 会静默拒绝 symlink,直接 fallback 到 copy
路径、name、git 初始化、权限、options —— 五个点只要漏一个,vendor/ 就是静态副本,改了等于白改。











