Composer不检查path依赖是否提交,所谓“未提交变更被忽略”实为symlink失效、路径错配或autoload未更新所致;name和url必须严格匹配,本地包需配置"options":{"symlink":true"},且主项目须手动运行composer dump-autoload -o生效。

Composer 本身不提供“忽略 path 依赖未提交变更”的开关——它根本不会检查你本地包有没有 git commit,也不会因为没提交就拒绝加载。所谓“未提交的代码变更被忽略”,其实是 symlink 失效、路径错配或 autoload 未更新导致的假象。
path 仓库 require 失败但没报错?先查 name 和路径是否完全匹配
90% 的“改了代码不生效”问题,根源在 name 或 url 不一致:
-
name必须大小写、分隔符(仅短横线-)逐字相同,"acme/utils"≠"Acme/Utils"≠"acme_utils" -
url必须指向**含合法composer.json的目录**,且是相对于主项目composer.json的路径,比如"../acme-utils",末尾不能带/ - Windows 下路径含空格或中文时,某些 PHP 版本会静默失败;Docker 中需加
--cap-add=SYS_ADMIN才能创建 symlink
改了本地包代码,vendor 里还是旧的?大概率 symlink fallback 了
Composer 默认尝试 symlink,但失败时会静默 fallback 到 copy 模式——你改的是源码,运行的却是副本。
- 真正控制 symlink 是否启用的,是**本地包自己的
composer.json**,不是主项目的配置;必须有:"options": {"symlink": true} - 验证是否真用了 symlink:
ls -la vendor/acme/utils(Linux/macOS)或dir vendor\acme\utils(Windows),看到箭头或JUNCTION才算成功 - Windows 用户必须以管理员身份运行终端;否则 symlink 创建失败且无提示
autoload 不生效?dump-autoload 不自动触发,得手动跑
path 仓库让包“存在”,但类能否 new 或 use,取决于 autoload 映射是否包含真实路径。Composer 不会自动监听本地包文件变动。
- 本地包改了
psr-4映射或新增类文件后,必须在**主项目根目录**运行:composer dump-autoload -o - 如果本地包用了
classmap,增删文件后也必须重新dump-autoload,它不支持动态发现 - Xdebug 断点打不上?确认 IDE 里打开的文件路径和磁盘真实路径一致(symlink 会让 IDE 误读为 vendor 下的副本)
最常被忽略的一点:path 依赖的“实时性”只存在于开发阶段,它依赖 symlink + 手动 dump-autoload + 本地包 composer.json 的正确配置三者同时成立。少一个,就变成“看似连上了,实则没生效”。











