composer本地包修改不生效是因为默认使用dist/source安装而非符号链接,需配置path仓库类型并用composer update建立软链接。

本地包改完代码,composer install 不生效?
不是 Composer 缓存的问题,是它根本没去读你改过的文件——默认情况下,Composer 把本地包当成远程包处理,安装的是 dist(压缩包)或 source(git clone 出来的干净副本),你本地 vendor/xxx/yyy 里的代码只是个只读快照。
真正起作用的是 path 仓库类型,它让 Composer 直接软链接到你的开发目录,改完即见效果。
- 在项目根目录的
composer.json中添加仓库配置:"repositories": [ { "type": "path", "url": "../my-local-package" } ] - 然后 require 它(版本必须匹配
my-local-package的composer.json中version字段,比如"dev-main"或"1.0.x-dev"):"require": { "vendor/my-local-package": "dev-main" } - 运行
composer update vendor/my-local-package,不是install——update 才会重新解析 path 仓库并建立符号链接
composer update 后还是没链接?检查这三处
路径对了、版本对了,但 vendor/vendor/my-local-package 仍是复制体而非链接,大概率卡在这几个细节上:
-
url必须是**绝对路径或相对于composer.json的相对路径**,不能用~/或环境变量;推荐用../xxx这种显式相对写法 - 本地包的
composer.json里不能有"type": "project",否则 Composer 会跳过 path 加载;建议设为"type": "library" - 本地包目录下不能有
.git且处于“脏”状态(未提交的修改),否则 Composer 默认 fallback 到 zip 包安装;加"options": {"symlink": true}强制链接,或先git add -A && git commit -m "wip"
调试时想断点进本地包,IDE 却跳转到 vendor 里的副本?
因为 IDE(如 PHPStorm)索引的是 vendor/ 下的物理路径,而 path 模式实际创建的是符号链接,但某些 IDE 默认不跟随 symlinks,或者缓存了旧路径映射。
- PHPStorm:打开
Settings > Directories,把vendor/vendor/my-local-package标记为 “Excluded”,再把你的本地包路径(如../my-local-package)标记为 “Sources” - VS Code:确保
intelephense.environment.includePaths包含本地包路径,且关闭intelephense.environment.followSymbolicLinks(新版默认开启,反而容易混乱) - 终极验证:在项目里执行
readlink vendor/vendor/my-local-package,输出应为你的开发路径;如果输出为空,说明根本没链接成功
上线前忘记切回正常包依赖?
path 仓库只应在开发机生效,CI、测试环境或生产部署时必须禁用,否则会因路径不存在直接报错 Could not find a matching version of package vendor/my-local-package。
- 不要把
repositories提交到主分支;用composer.json的config.platform或分支策略隔离 - 更稳妥的做法:把 path 配置放在独立的
composer.dev.json,开发时运行COMPOSER=composer.dev.json composer update - CI 脚本里显式清除:
composer config --unset repositories再 install,避免继承本地配置
path 模式本质是开发期的“快捷方式”,它绕过了版本约束和包分发流程,一旦习惯就容易忽略真实依赖关系。上线前多看一眼 composer show vendor/my-local-package 的 source 路径,比什么都管用。











