path依赖未生效的主因是symlink未成功创建、本地包composer.json缺少"options":{"symlink":true}、autoload映射未刷新或配置错误。需验证链接状态、检查name/url一致性、运行composer dump-autoload -v排查扫描问题。

path依赖改了代码却没生效,90%是symlink没建成功
Composer的path仓库默认尝试创建符号链接,但失败时会静默回退到复制(copy)模式——你改的是本地源码目录,运行时加载的却是vendor/里一份静态副本,毫无提示。
验证是否真用了 symlink:
Linux/macOS 执行 ls -la vendor/vendor/name,看到 -> 才是链接;
Windows 执行 dir vendorendor
ame,看到 JUNCTION 或 SYMLINKD 才算成功。
-
关键点不在主项目
composer.json里写"symlink": true,而在于本地包自己的composer.json中必须包含"options": {"symlink": true} - Windows 用户必须以管理员身份运行终端,否则创建失败且无任何提示
- Docker 场景需加
--cap-add=SYS_ADMIN,且挂载方式要支持符号链接(如用绑定挂载而非普通-v) - 路径末尾不能带
/,"url": "../my-pkg/"会被 Composer 完全忽略该仓库
autoload映射不更新,不是没扫描,而是路径没对上
即使 symlink 成功,new MyClass() 仍报 Class not found,大概率是 autoload 配置未被识别或映射路径错误。
别猜,让 Composer 自己说:运行 composer dump-autoload -v,它会逐行输出扫描行为。
- 如果输出里压根没出现你的命名空间(比如
App),说明本地包的composer.json有语法问题:多逗号、BOM、单引号、或 PSR-4 键值末尾漏了反斜杠("App"❌ vs"App\"✅) - 如果扫描到了命名空间但跳过了某些文件,注意看提示:可能是文件含 BOM、短标签未启用、或存在
.php.bak这类非法 PHP 文件卡住解析 - 最终映射是否写进
vendor/composer/autoload_psr4.php?打开它搜索你的前缀,确认映射路径是绝对路径(如$baseDir . '/src'),再手动检查该路径下是否存在对应文件
require失败但composer show --all看不到包名
这是 path 仓库最典型的“静默失效”:配置写了,但 Composer 根本没加载它。
根本原因只有两个:name 字段不匹配,或 url 路径不对。
-
name必须大小写、分隔符(仅短横线-,不能用下划线_或大写字母)完全一致,例如"acme/utils"≠"Acme/utils"≠"acme_utils" -
url指向的是含composer.json的目录,不是文件,且必须是相对于主项目composer.json的位置(如"../my-pkg"),不是 shell 当前工作目录下的相对路径 - Windows 用户避免路径含中文或空格,某些 PHP 版本解析会失败
- 检查本地包根目录下是否存在合法
composer.json(无尾逗号、全双引号、JSON 语法有效)
想实时刷新,又不想每次手动dump-autoload
Composer 不监听文件变更,composer install 或 update 后不会自动重生成 autoload 映射。改了本地包的类结构(新增/删改命名空间、移动文件),必须手动触发。
- 开发中建议加个脚本别名:
alias cda='composer dump-autoload -o && echo "autoload refreshed"' - 若用 Laravel,可配合
php artisan clear-compiled+php artisan optimize:clear(部分版本会连带清 OPcache,但不保证) - 更彻底的做法:在本地包根目录放一个
reset-dev.php,内容为unregister(); ComposerAutoloadClassLoader::getInstance()->register();,改完代码后执行它 - 注意:
composer dump-autoload -o生成的优化版映射是静态数组,不支持动态路径变化,所以 symlink 生效后仍需重新 dump
路径和 name 的逐字一致性、symlink 的双重声明(本地包自身配置)、autoload 映射的显式刷新——这三处不满足任意一项,path 依赖就只是“看起来在用”,实际早已 fallback 到 copy 或完全不可见。











