根本原因是vendor目录下是复制副本而非符号链接;需在本地包composer.json中配置"options": {"symlink": true"},验证ls -la输出含->,并执行composer update vendor/name生效。

为什么改了本地包代码,项目里还是旧逻辑?
根本原因不是 Composer 没读到文件,而是你看到的 vendor/vendor/name 根本不是符号链接——它是个复制出来的副本。Composer 默认尝试 symlink,但失败时会静默 fallback 到 copy,之后你改本地源码,vendor/ 里完全不受影响。
验证方式很简单:ls -la vendor/vendor/name(Linux/macOS)或 dir vendor\vendor\name(Windows)。如果输出里没有 -> 或 JUNCTION,说明 symlink 没建成功。
- 检查本地包根目录下的
composer.json是否包含"options": {"symlink": true}—— 这句必须写在**本地包自己的 composer.json 里**,不是主项目的 - Windows 用户必须以管理员身份运行终端;Docker 容器需加
--cap-add=SYS_ADMIN并确认挂载支持 symlink - 路径末尾不能带
/,比如"url": "../my-pkg/"会被 Composer 忽略整个仓库 - 确认本地包
composer.json的name字段与主项目require中写的**逐字一致**:大小写、短横线-、vendor 名全部对齐,acme/utils≠Acme/utils
autoload 更新了没?类找不到别怪 symlink
symlink 成功 ≠ 类能自动加载。Composer 只负责把目录链过去,类能否 new 或 use,取决于 autoload 映射是否包含真实路径。改了本地包的 psr-4 配置(比如新增命名空间),或者加了新类,composer install 和 composer update 都不会自动刷新映射。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 必须手动运行
composer dump-autoload -o(加-o强制优化,避免开发时漏掉) - IDE 断点不生效?检查 IDE 里配置的路径是否和磁盘真实路径一致——比如 Windows 上
C:\dev\my-pkg和c:\dev\my-pkg被某些 IDE 当作不同路径处理 - 如果本地包用了
classmap,新增文件后也得重新dump-autoload,否则自动加载器压根不知道有这个文件
改完代码,怎么让项目立刻用上新版本?
composer install 不会重建已有 symlink,它只补缺失项。也就是说,第一次 composer require vendor/name:dev-main 或 composer update 创建了链接后,后续本地代码修改,install 就是摆设。
- 改完本地包代码,只需运行
composer update vendor/name—— 指定包名,快且安全;不加包名会全量重算,可能意外升级其他依赖 - CI/CD 环境下别指望 path 仓库能工作,上线前必须从
repositories里删掉对应条目,改用 VCS 或私有 Packagist - 想强制复制而非链接?在主项目
composer.json的config里加"preferred-install": {"vendor/name": "dist"},但这就失去“改即生效”的意义了
常见报错“Could not find package”到底卡在哪?
这个错误 90% 不是网络或权限问题,而是 name 或路径没对齐。Composer 不模糊匹配,差一个字符就放弃 path 仓库,转头去 Packagist 找稳定版,结果当然找不到。
- 运行
composer show --all | grep vendor/name,如果输出为空,说明 path 仓库压根没被识别 - 确认
url指向的是**含composer.json的目录**,不是文件,也不是父级空目录 - Windows 下路径含中文或空格会导致某些 PHP 版本解析失败,换英文路径再试
- 打开
composer.lock搜索该包,确认"source": { "type": "path" }存在,而不是"type": "git"—— 后者说明 fallback 成远程拉取了
composer.json 里写了 "options": {"symlink": true}、主项目 require 和 name 严丝合缝、改完代码后跑一次 composer update vendor/name。其余都是围绕这三点的验证和兜底。

















