必须在主项目composer.json的repositories中声明type: "path",且本地包的name、路径、composer.json结构三者严格对齐,否则composer无法识别该包。

必须在主项目 composer.json 的 repositories 里声明 type: "path",且本地包的 name、路径、composer.json 结构三者严格对齐,否则 Composer 根本“看不见”它。
为什么 composer require vendor/name 报 “Could not find package”
这不是网络问题,也不是缓存没清——Composer 压根没去你本地目录找。它只扫描 repositories 数组里声明的源,而 require 字段只负责说“我要谁”,不负责说“去哪拿”。
-
repositories必须写在主项目(即你正在运行composer install的那个项目的)根级composer.json中,不能塞进require或其他字段里 -
url必须是相对于主项目composer.json的路径,例如"../my-pkg";写成"file:///home/xxx"或"C:xxx"在多数场景下会静默失效 - 目标目录下必须存在合法的
composer.json:有name(大小写、短横线-全匹配)、有version(哪怕写"dev-main"),且 JSON 语法有效(无尾逗号、全双引号) - 若本地包没打 tag,
require时版本必须用dev-main、dev-develop这类分支名,不能写1.0.0或*
怎么确认 symlink 是否真正生效
默认行为是尝试创建符号链接,但失败就静默 fallback 到复制——这是最隐蔽的调试陷阱。改了本地代码却没生效?大概率是因为你看到的 vendor/vendor/name 是个普通文件夹,不是链接。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- Linux/macOS 下运行:
ls -la vendor/vendor/name,输出含->才算成功 - Windows 下运行:
dir vendorendor ame,看到JUNCTION或“快捷方式”字样才是 symlink - 关键不在主项目配
"symlink": true,而在于**本地包自己的composer.json是否包含"options": {"symlink": true}** - Windows 需管理员权限运行终端;Docker 需加
--cap-add=SYS_ADMIN并确保挂载支持 symlink
composer install 后本地改代码为啥不生效
composer install 不会刷新已有链接的目标路径,它只按 composer.lock 还原状态。改完本地包代码后,必须显式触发重建。
- 执行
composer update vendor/name(推荐),不是composer install,也不是composer dump-autoload -
composer update无参数会重算全部依赖,慢且易引入意外变更;指定包名更安全 - 如果之前装过非 path 类型的同名包,先
composer remove vendor/name再重新require,否则旧副本可能残留 - CI/CD 环境下 symlink 必然失败,上线前必须移除
repositories中的 path 条目
autoload 映射不更新,不是 Composer 没加载,而是路径没注册
path 仓库让包“存在”,但 new Helper() 找不到类?问题出在 autoload 映射没覆盖真实路径,和 symlink 是否启用无关。
- 确保本地包
composer.json中autoload正确声明了命名空间与路径,例如"psr-4": {"Acme\": "src/"} - 主项目执行
composer dump-autoload -o才会把本地包的 autoload 规则合并进来 - 该命令不会重建 symlink,只刷新类加载映射;所以得先确认 symlink 已生效,再 dump-autoload
- Xdebug 断点不命中?检查 IDE 中设置的路径是否和磁盘上 symlink 指向的真实路径一致(尤其 Windows 路径大小写、盘符)
最容易被忽略的是:本地包 composer.json 里漏掉 "options": {"symlink": true},以及 Windows 下没以管理员身份运行终端——这两点导致 symlink 创建失败却无任何提示,你以为在热更新,其实一直在跑旧副本。










