根本原因是主项目composer.json未配置repositories或缺"options": {"symlink": true};需在主项目中声明path型仓库、使用相对路径、确保本地包name匹配,并执行composer update触发symlink重建。

本地改了代码,主项目不生效?不是 autoload 没刷,是根本没走 symlink 路径——composer.json 里漏了 repositories,或者 options: {"symlink": true} 没配。
为什么 composer require vendor/name:dev-main 总报 “Could not find package”
Composer 不会自动扫描硬盘找本地目录。它只认主项目 composer.json 的 repositories 字段声明的路径。
-
repositories必须写在主项目的composer.json里,不能写在本地包自己的composer.json中 -
url必须是相对路径(如"../packages/auth"),Windows 上用绝对路径大概率静默失败(盘符、空格、反斜杠全踩雷) - 目标目录下必须存在合法
composer.json,且其中name(如"myorg/auth")要和require里写的完全一致(大小写敏感) - 版本约束只能用
dev-main、dev-develop这类分支名;path类型源忽略version字段,只读当前 Git HEAD 所在分支
怎么让改完本地包代码立刻在主项目里生效
默认行为是复制(copy),不是链接(symlink)。你改了 ../packages/auth/src/Service.php,vendor/myorg/auth/src/Service.php 还是旧文件。
- 必须显式启用符号链接:在主项目
composer.json的对应repositories条目里加"options": {"symlink": true} - 执行
composer update myorg/auth(不是dump-autoload),才会重建 symlink - 验证是否成功:
ls -la vendor/myorg/auth应显示-> ../packages/auth;Windows 用户用dir vendor\myorg\auth看是否为“快捷方式”类型 - Windows 需开启开发者模式或以管理员权限运行命令行,否则 symlink 创建失败且无提示
CI/CD 和生产环境为什么不能留 path 仓库配置
path 类型仓库本质是开发期捷径,它跳过所有远程元数据请求,直接读取本地文件系统。这在 CI/CD 流水线里天然失效——构建机上根本没有 ../packages/auth 这个路径。
- 上线前必须从主项目
composer.json的repositories数组中移除所有type: "path"条目 - 本地包应提前发布到私有源(如 Satis 或 Private Packagist),生产环境通过标准
composer install拉 dist 包 - 若强行保留 path 配置,
composer install会直接报错退出,不会 fallback 到远程源
最容易被忽略的一点:symlink 生效的前提是主项目 lock 文件里记录的是该 path 包的解析结果。如果之前用的是 composer require 引入但没配 symlink,后续加了 options 也不会自动修复——必须 composer update vendor/name 强制重解析一次。











