本地包未进 vendor 主因是 composer install 不读 repositories 配置,须用 composer update 或 composer require;repositories 必须置于主项目 composer.json 根级,路径为相对目录且含合法 composer.json;name 严格小写匹配,分支名需一致并已 git 初始化;path 类型默认 symlink,Windows 需显式启用;三处包名(repositories/url、本地包 name、require)必须完全一致。

本地包没进 vendor,90% 是因为用了 composer install
它只照 composer.lock 里已记录的来源安装,完全不读 repositories 配置。哪怕你刚在 composer.json 里加了 "type": "path",执行 composer install 也毫无反应。
必须删掉 composer.lock 后运行 composer update,或直接 composer require vendor/name:dev-main ——只有这两个命令会触发 Composer 扫描并识别本地 path 仓库。
更安全的做法是:composer update vendor/name,避免全量更新导致其他依赖意外升级。
repositories 写错位置或路径格式就等于没写
必须写在主项目(即你正在开发的那个项目的)composer.json 根级 repositories 数组里,不能塞进 require、config 或本地包自己的 composer.json 中。
-
url必须是相对路径,如"../my-package"或"./packages/utils";开头必须带./或../ - 绝对路径(如
/home/user/pkg)、file://前缀、波浪号~、环境变量全部静默失效 - 路径指向的是**目录**,不是
composer.json文件本身;该目录下必须存在合法的composer.json - 多个本地包要逐个声明:
[{"type":"path","url":"../pkg-a"},{"type":"path","url":"../pkg-b"}],不支持通配符自动扫描
本地包的 composer.json 三要素必须严丝合缝
Composer 不猜、不推导、不忽略大小写——它只字面匹配 name 字段,并按 Git 分支名解析版本。
-
name必须是vendor/name格式,全小写、只含字母/短横线,如"acme/utils";写成"Acme/Utils"或"acme_utils"都会失败 - 没打 tag 就别写
"1.2.0",改用"dev-main"或"dev-develop";分支名必须和本地 Git 实际分支一致 - 目录必须已执行
git init && git add . && git commit -m "init",否则 Composer 直接跳过该路径 -
autoload要配好 PSR-4,例如"psr-4": {"Acme\Utils\": "src/"},否则类加载会报Class not found
符号链接没生效?检查 symlink 和权限
path 类型默认创建符号链接(symlink),不是复制文件。改了本地源码,vendor/ 下立刻可见——但前提是链接真建成了。
- Linux/macOS 默认启用 symlink;Windows 必须显式加
"options": {"symlink": true},且需开启“开发者模式”或以管理员权限运行命令行 - 验证是否成功:
ls -la vendor/vendor/name应显示->指向源目录;Windows 下用dir vendorendor ame看是否为“快捷方式”类型 - 如果看到的是普通文件夹,说明没走 path 源,可能是被 vcs 或 Packagist 覆盖了,或
"symlink": false被设了 - 改完本地包代码后,只需
composer update vendor/name重建链接;composer dump-autoload只刷新自动加载器,不重建 symlink
repositories 的路径、本地包 composer.json 的 name、require 行里的包名字符串——错一个,就静默失败,连错误提示都不给。


















