必须执行 composer update vendor/name 才能刷新本地 path 包,因 install 仅按 lock 文件复原且跳过 path 仓库;update 会重解析、重建 symlink 并更新 autoload。

改了本地包代码,vendor/ 里没变?不是 Composer 没 reload,而是它压根没触发重新链接或重载 autoload —— composer install 不管已存在的 path 包,composer update 才是唯一有效动作。
为什么 composer install 不刷新本地 path 包
composer install 只按 composer.lock 复原状态,对 path 类型仓库完全跳过处理。即使你改了本地包的 composer.json、加了新类、甚至删了整个 vendor/,只要 lock 文件没变,Composer 就不会碰它。
- path 仓库不是“远程包”,没有版本号校验逻辑,不参与 lock 文件的 hash 计算
- install 时只检查 vendor 目录是否存在对应路径,存在就直接跳过
- 静默跳过,不提示、不报错、也不输出任何日志
必须用 composer update vendor/name 显式刷新
只有 update 命令会强制重新解析 repositories → 读取本地包 composer.json → 检查 symlink 条件 → 重建链接或复制文件 → 重生成 autoload 映射。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 不要写
composer update(全量更新),容易误升其他依赖;精准执行composer update acme/utils - 如果本地包改了命名空间或 PSR-4 路径,
update后必须再跑一次composer dump-autoload - Windows 用户若看到 “Operation not permitted”,说明终端没以管理员身份运行,symlink 创建失败但无提示
验证 symlink 是否真生效
别信命令输出,直接看文件系统。链接没建成功,你改的永远是源码目录,运行时加载的还是 vendor 里的旧副本。
- Linux/macOS:
ls -la vendor/acme/utils,看到-> ../php-management-api-client才对 - Windows:
dir vendor\acme\utils,看到JUNCTION或SYMLINKD字样 - 如果显示普通文件夹,说明 fallback 到 copy 模式了——检查本地包
composer.json是否写了"options": {"symlink": true}
autoload 不生效?先看 dump-autoload -v 输出
类找不到,90% 是 autoload 没扫到路径,而不是 symlink 问题。Composer 不继承本地包的 autoload 配置,主项目必须自己声明或靠 update 触发合并。
- 运行
composer dump-autoload -v,观察输出里有没有你的命名空间(如Acme\)和对应路径 - 如果没出现,说明主项目的
composer.json的"autoload"字段没配,或者语法错误(BOM、多逗号、单引号) - 如果出现了但提示 “skipped”,检查路径末尾是否漏了反斜杠(
"Acme\": "src/"✅,"Acme": "src"❌) - 最终映射写在
vendor/composer/autoload_psr4.php,打开它确认路径是绝对路径且真实存在
最常被忽略的一点:本地包自己的 composer.json 必须有 "options": {"symlink": true},不是主项目的。Windows 和 Docker 场景下,这个字段缺了就等于没配。










