本地包没生效主因是symlink未建立,表现为vendor中为普通文件夹而非链接;根本解决需在本地包composer.json中配置"options": {"symlink": true},并用ls -la或dir验证箭头/JUNCTION。

本地包没生效,90%是 symlink 没真正建立起来,不是路径写错就是本地包缺 options 配置。
为什么改了代码 vendor 里没反应?
Composer 的 path 仓库默认尝试创建符号链接(symlink),但失败时会静默 fallback 到复制(copy)模式——你看到的 vendor/vendor/name 是个普通文件夹,不是链接,自然改源码不生效。
- 关键不在主项目
composer.json里配"symlink": true,而在于本地包自己的composer.json必须包含"options": {"symlink": true} - Windows 下必须以管理员身份运行终端,否则
mklink失败且无提示 - Docker 容器需加
--cap-add=SYS_ADMIN,且挂载方式要支持 symlink(如-v $(pwd)/../my-pkg:/workspace/my-pkg) - 验证是否真用了 symlink:
ls -la vendor/vendor/name(Linux/macOS)或dir vendorendor ame(Windows),看到箭头或JUNCTION才算成功
本地包 name 和路径怎么配才不报错?
Could not find package vendor/name 这类错误,几乎全是 name 或路径不匹配导致的,Composer 不做模糊匹配。
-
name字段必须和require中写的逐字一致:大小写、分隔符(只允许短横线-,不能用下划线_或大写字母)全部对齐,例如"acme/utils"≠"Acme/utils" -
url必须指向含composer.json的目录,且是相对于主项目composer.json的路径,比如"../my-pkg",不能是"../my-pkg/"(末尾斜杠会被忽略) - 本地包根目录下必须有合法
composer.json:无尾逗号、全双引号、JSON 语法有效;name值不能为空或仅含空格 - Windows 用户避免路径含中文或空格,某些 PHP 版本解析会失败
autoload 更新了但类还是找不到?
路径仓库让包“存在”,但类能否被 new 或 use,取决于 autoload 映射是否指向真实路径。即使本地包写了 "psr-4": {"Acme\": "src/"},主项目也不会自动继承这个映射。
- 主项目执行
composer dump-autoload -o是必须的,否则新类或命名空间不会被扫描进自动加载器 - 如果本地包结构变更(比如新增命名空间或移动类文件),必须手动触发该命令
- Xdebug 断点失效?检查 IDE 中配置的路径是否与磁盘真实路径一致(例如 Windows 上
C:workmy-pkgvsc:workmy-pkg大小写差异也会导致断点不命中)
调试时该看什么日志和输出?
别只盯着终端红字,关键信息藏在 verbose 输出和日志里。
- 加
--verbose运行命令:composer install --verbose或composer update --verbose,能看到仓库解析顺序、是否识别到 path 类型、symlink 创建过程等 - 查 Composer 自身日志:
cat ~/.composer/logs/composer.log(Linux/macOS)或type %USERPROFILE%AppDataRoamingComposerlogscomposer.log(Windows) - 用
composer show --all | grep vendor/name确认包是否被识别;如果show不出来,说明仓库配置压根没生效 - 执行
composer config repositories查看当前生效的仓库列表,确认path条目是否在其中
最隐蔽的问题永远出在 symlink 是否真实存在、autoload 是否手动刷新、以及 name 和路径的字符级一致性上——这三个点漏掉任何一个,调试就会陷入“改了却没变”的死循环。


















