Composer update 不装本地包修改是因为默认复制而非符号链接,需在 path 仓库配置 "options": {"symlink": true} 并删除 vendor 中旧目录后重装。

为什么composer update总装不上你刚改的本地包?
不是 Composer 不认你的修改,而是它默认把本地包当成“已发布版本”来缓存——哪怕你用的是 path 仓库,只要 vendor/ 下已有该包目录,composer update 就跳过重拉,连 composer dump-autoload 都不会触发自动重映射。
path 仓库必须配 "options": {"symlink": true}
直接写 "type": "path", "url": "../my-local-package" 是危险操作:Composer 默认会复制(copy)整个目录进 vendor/,后续改源码完全无效。必须显式启用符号链接:
{
"repositories": [
{
"type": "path",
"url": "../my-local-package",
"options": {
"symlink": true
}
}
]
}
- Windows 用户注意:
symlink需管理员权限启用,或在 Git Bash / WSL 中执行 - PHPStorm 等 IDE 可能不跟随 symlink 自动索引,需手动刷新或关闭 “Exclude external changes”
- 启用后,
vendor/my-vendor/my-local-package就是../my-local-package的实时软链,改源码即生效
删 vendor/ 子目录比 clear-cache 更快更准
遇到“改了代码但 php artisan tinker 还是旧逻辑”,别急着 composer clear-cache——path 类型包根本不用走 ZIP 缓存,问题只在 vendor/ 里残留的旧拷贝或坏软链。
- 先确认是否真用了 symlink:
ls -la vendor/my-vendor/my-local-package,输出含->才对 - 如果不是 symlink,直接删掉:
rm -rf vendor/my-vendor/my-local-package - 再跑一次
composer update my-vendor/my-local-package --no-cache,强制重建软链 - Windows 上用 PowerShell:
Remove-Item -Recurse -Force vendor\my-vendor\my-local-package
开发时关掉优化自动加载器
"optimize-autoloader": true 或 -o 参数会生成静态类映射,导致你新增的类文件不被识别,调试期务必禁用:
- 临时禁用:
composer dump-autoload(不带-o) - 永久禁用:删掉
composer.json里的"optimize-autoloader"字段,或设为false - 若已启用 APCu 缓存(
"apcu-autoloader": true),开发中也建议关掉,否则类变更需手动apcu_clear_cache()
真正卡住调试的,往往不是缓存本身,而是 symlink 没生效、autoload 没刷新、或 IDE 锁住了 vendor 目录——这些比清全局缓存更常发生,也更容易漏查。


















