必须用 type: "path" 仓库且本地包 composer.json 中声明 "options": {"symlink": true"},否则默认复制(copy)导致改代码不生效;验证需用 ls -la 或 dir 查看 vendor 下是否含 -> 或 JUNCTION。

必须用 type: "path" 仓库 + 本地包 composer.json 中声明 "options": {"symlink": true},否则默认是复制(copy),改代码不生效。
为什么 composer update 后 vendor/ 里还是普通文件夹?
Composer 的 path 类型仓库默认行为是「复制」而非「符号链接」——这是设计,不是 bug。它只在满足特定条件时才创建 symlink:
- 本地包根目录的
composer.json必须包含"options": {"symlink": true};光在主项目配置repositories不够 - 执行的是
composer update vendor/name(不是install),且该包此前未安装过 - Linux/macOS 下一般自动成功;Windows 需管理员权限运行终端,否则静默 fallback 到 copy
- Docker 容器需加
--cap-add=SYS_ADMIN并挂载支持 symlink 的卷(如bind模式)
验证是否真用了 symlink:ls -la vendor/vendor/name(Linux/macOS)或 dir vendorendor
ame(Windows),看到箭头或 JUNCTION 才算成功。
Could not find package vendor/name 的真实原因
这个报错 90% 和网络、权限、版本无关,纯粹是 name 或路径对不上:
-
name字段必须和require中字符串逐字一致:大小写、分隔符(仅允许短横线-)、斜杠位置全部匹配,"acme/utils"≠"Acme/utils"≠"acme_utils" -
url是相对于主项目composer.json的路径,不是 shell 当前目录,例如"../my-pkg"✅,"./my-pkg"❌(若主项目composer.json在子目录中) -
url指向的必须是含合法composer.json的目录,不能是文件,末尾不能带/("../my-pkg/"会被静默忽略) - Windows 下路径含中文或空格,某些 PHP 版本会解析失败,建议全英文无空格路径
autoload 不生效?别怪 Composer,先查映射链路
即使 symlink 成功,new MyPackageCalculator() 报错 Class not found,大概率是 autoload 没配对:
- 本地包
composer.json的autoload.psr-4必须正确指向源码目录,例如{"MyPackage\": "src/"} - 测试类要进
autoload-dev,且 PSR-4 映射末尾必须带反斜杠:{"MyPackage\Tests\": "tests/"}(少一个就断掉) - 改完
autoload后,必须手动执行composer dump-autoload --dev,否则vendor/composer/autoload_dev.php不更新 - 验证方式:直接运行
php -r "echo class_exists('MyPackage\Calculator') ? 'ok' : 'fail';",输出ok才说明生产 autoload 生效
Windows 下 symlink 失败却没提示,怎么办?
这是最隐蔽的坑:Windows 默认禁用开发者模式或管理员权限时,symlink 创建失败,但 Composer 不报错,直接 fallback 到 copy。结果你改本地代码,vendor/ 里永远是旧副本。
解决方法只有两个:
- 以管理员身份运行终端(PowerShell 或 CMD),再执行
composer update - 或启用 Windows 开发者模式(设置 → 更新与安全 → 针对开发人员 → 开发者模式),并确保 Git Bash / WSL 等环境也具备 symlink 权限
别依赖 IDE 自动刷新或清缓存——只要 vendor/ 目录不是 symlink,所有调试都是徒劳。











