答案是composer install只按composer.lock安装,不解析repositories配置;必须删lock后运行composer update或直接composer require才能加载新本地包。

本地路径加载不生效,90% 是因为 composer install 根本不读 repositories 配置——必须用 composer update 或 composer require 触发识别。
为什么 composer install 从不加载本地包
它只照着 composer.lock 里已记录的来源和版本安装,完全跳过 repositories 解析。哪怕你刚在 composer.json 里加了 "type": "path",执行 install 也毫无反应。
- 锁文件里还是 Packagist 的旧记录?本地配置再对也没用
- 想让新仓库生效,必须删掉
composer.lock后运行composer update,或直接composer require vendor/name -
composer update vendor/name比全量更新更安全,避免其他依赖意外升级
repositories 中 type: "path" 的写法细节
路径必须是相对路径,且指向一个含合法 composer.json 的完整目录;绝对路径、file:// 前缀、波浪号 ~ 全部静默失效。
- 正确写法:
"url": "../my-package"或"url": "./packages/utils"(注意开头的./或../) - 错误写法:
"url": "/home/user/pkg"、"url": "file:///tmp/pkg"、"url": "my-package"(缺上级路径) - 支持通配符:
"url": "../packages/*",Composer 会扫描所有匹配子目录下的composer.json - 目录必须有 Git 提交(至少一个 commit),否则 Composer 拒绝加载
本地包的 composer.json 必须满足什么条件
包名、版本标识、autoload 配置三者不匹配,就会报 Could not find package 或 Class not found,和网络无关。
-
name字段(如"acme/utils")必须与require中写的完全一致(大小写、斜杠都不能错) - 没打 tag 就别写
"1.2.0",改用"dev-main"或"dev-develop";分支名要和实际 Git 分支一致 -
autoload必须声明 PSR-4 映射,例如:"psr-4": {"Acme\Utils\": "src/"} - 改完本地包的
composer.json或代码后,需在主项目中运行composer dump-autoload才能刷新自动加载器
符号链接不是 bug,是默认行为
用 type: "path" 加载成功后,vendor/vendor/name 是个符号链接,指向你本地源码目录——这是为了实时编辑调试。如果看到的是普通文件夹,反而说明配置没走 path 源,可能被 vcs 或 packagist 覆盖了。
- Linux/macOS 下用
ls -l vendor/acme/utils看是否显示-> - Windows 用户注意:启用开发者模式或以管理员身份运行命令行,否则软链创建失败
- CI/CD 环境禁用 symlink(加
"options": {"symlink": false}),但本地开发别关
最易忽略的一点:路径写对了、包名对了、命令也用了 update,但依然失败——八成是本地包目录里压根没有 composer.json,或者该文件语法错误(比如多了一个逗号)。Composer 不报错,只是安静跳过那个仓库。











