根本原因是Git未忽略vendor/目录导致误提交;应立即在.gitignore中添加/vendor/,并运行git rm -r --cached vendor清除已提交记录。

本地包调试时 vendor 目录被误提交怎么办
根本原因是 composer install 生成的 vendor/ 在本地开发时容易和主项目混在一起,尤其用路径仓库("type": "path")时,符号链接可能被 Git 当作普通文件提交。Git 默认不忽略 vendor/,一旦忘记加规则,就会把整个第三方依赖树塞进仓库。
实操建议:
- 确认项目根目录下
.gitignore包含/vendor/(开头带斜杠,避免匹配子目录里的 vendor) - 如果已误提交,运行
git rm -r --cached vendor清除索引但保留本地文件,再提交 - 对本地路径包本身(如
../my-local-package),它自己的vendor/也必须单独加.gitignore,否则嵌套污染风险极高
路径仓库(path repository)如何防止 dev 依赖泄漏到主项目
本地包的 composer.json 里常有 "require-dev"(比如 phpunit/phpunit),但通过 "type": "path" 引入时,Composer 默认会把它的 require-dev 也装进主项目的 vendor/ —— 这违反了“生产环境只装 runtime 依赖”的原则。
实操建议:
- 在主项目执行
composer install --no-dev,强制跳过所有require-dev,包括路径包的 - 更稳妥的做法:本地包自身把测试类放到
tests/,并在autoload-dev中声明,这样即使装了也不会影响自动加载逻辑 - CI 流程中禁止使用
composer update,一律用composer install+composer.lock,杜绝 dev 依赖意外激活
怎么验证本地包修改是否真正生效,而不是缓存假象
Composer 缓存、OPcache、甚至 IDE 的文件索引都可能导致你改了代码却看不到效果,误以为逻辑没走通。尤其当本地包被 symlink 到主项目时,PHP 可能仍从旧的 realpath 加载类。
实操建议:
- 每次改完本地包后,运行
composer dump-autoload --optimize(主项目目录下),强制刷新 autoloader 映射 - 检查实际加载路径:
var_dump((new ReflectionClass(MyLocalPackage\SomeClass::class))->getFileName());,确认输出的是../my-local-package/src/...而非vendor/... - 临时禁用 OPcache:
php -d opcache.enable=0 your-script.php,排除字节码缓存干扰
多项目共用一个本地包时,如何避免版本错乱
当 A 项目和 B 项目都用 "type": "path" 指向同一个本地包目录,A 项目升级了包内接口但没发版本号,B 项目 composer update 后直接拉到未兼容的变更,报 Class not found 或 Method not exist。
实操建议:
- 本地包的
composer.json必须设"version": "dev-main"(或"dev-develop"),禁止留空;主项目 require 时写死分支名,如"vendor/my-local-package": "dev-main" - 不同项目需隔离开发节奏:A 项目用
dev-main,B 项目用dev-stable,通过 Git 分支物理隔离变更流 - 上线前必须跑
composer show vendor/my-local-package确认实际解析到的 commit hash,比对 Git 日志是否为预期版本
dev-* 版本都会被当作“最新快照”无条件接受——哪怕那个快照根本没经过任何测试。


















