composer config repo.path 是最直接的本地仓库配置方式,通过 composer config --local --add repositories.xxx type path 和 url 指定本地路径,支持通配符和软链接,优先级高于 packagist。

composer config repo.path 是最直接的本地仓库配置方式
想让 composer install 优先从本地目录拉包(比如调试中的私有组件、未发布到 Packagist 的模块),不用改 composer.json 或搭私有镜像,composer config 的 repo.path 就是为此设计的。它会把指定路径注册为一个 type=“path” 的仓库,支持通配符和软链接,且优先级高于 packagist.org。
常见错误现象:执行 composer install 后仍去远程下载,没走本地路径——大概率是没加 --add 参数,或路径没写对。
- 在项目根目录运行:
composer config --add repositories.my-local-path type path - 再指定路径:
composer config --add repositories.my-local-path url ./packages/* -
./packages/下需有符合 Composer 包结构的子目录,例如./packages/my-utils/composer.json,且其中"name"字段必须唯一(如"acme/my-utils") - 路径支持
*通配,但不支持**;Windows 用户注意用正斜杠/或双反斜杠\,单反斜杠会出错
为什么 vendor/bin/composer 不读取项目级 repo.path 配置
如果你在项目里用 vendor/bin/composer 执行命令,它默认只加载全局配置(~/.composer/config.json),不会自动合并当前项目的 composer.json 里的 repositories 块——除非你显式加 --no-plugins 或确认插件没干扰。
真正生效的路径仓库,必须写进项目级 composer.json 的 repositories 数组,或者通过 composer config 写入项目级配置文件(即不加 -g)。
- 查当前生效的仓库列表:
composer config repositories(不带-g) - 写入项目级配置(推荐):
composer config --local --add repositories.local type path - 避免误写全局:
composer config -g repositories输出里不该出现你的本地路径
path 仓库下 require 的包不更新?检查 symlink 和 autoload
用 type: "path" 时,Composer 默认创建符号链接(symlink)而非复制文件。这意味着你改了 ./packages/my-lib/src/ 里的代码,vendor/acme/my-lib/ 里立刻可见——但前提是:composer.json 里写了 "autoload",且你运行过 composer dump-autoload。
- 若发现修改源码后
vendor/下没变化,先确认是否真用了 symlink:ls -l vendor/acme/my-lib,输出应含-> - 如果显示普通目录,说明
"symlink": false被设了,或系统不支持(Windows 需管理员权限 + 开发者模式) - autoload 没生效?检查
composer.json中"autoload"是否覆盖了你改的文件路径,然后强制重生成:composer dump-autoload --optimize
切换回 packagist 时记得清理 path 仓库条目
path 仓库不是“开关”,而是持久写入配置的条目。切回标准流程前不清理,下次 composer update 仍会尝试匹配本地路径——哪怕那个目录已删,也会报 Source directory [xxx] does not exist 错误。
- 删项目级 path 仓库:
composer config --unset repositories.my-local-path - 删全局的(极少需要):
composer config -g --unset repositories.my-local-path - 手动编辑
composer.json删除对应repositories条目更直观,尤其当名字记不清时
最容易被忽略的是:path 仓库一旦写入,就参与所有依赖解析,包括 require-dev 和间接依赖。别让它在 CI 环境里意外生效。











