Composer需在repositories中配置type为"path"的本地包路径,url须为相对路径且本地包composer.json的name必须与require完全一致,安装后生成符号链接实现即时生效。

用 repositories + path 类型声明本地包
Composer 不会默认读取你本地目录里的代码,必须显式告诉它“这个包别去 Packagist 找,就用我本机的路径”。关键就在 repositories 配置块里加一个 type: "path" 条目:
{
"repositories": [
{
"type": "path",
"url": "../my-package"
}
],
"require": {
"vendor/my-package": "*"
}
}
这里 url 是相对于当前项目 composer.json 的路径,不能是绝对路径(如 /home/user/my-package),也不能是 HTTP 地址。Composer 会检查该目录下是否存在有效的 composer.json,否则报错 Could not parse version constraint 或直接跳过。
composer install 后生成的是符号链接,不是复制文件
执行 composer install 或 composer update 后,Composer 默认会在 vendor/vendor/my-package 下创建一个指向 ../my-package 的符号链接(Linux/macOS)或硬链接(Windows)。这意味着:
- 你在
../my-package里改任何 PHP 文件,主项目运行时立刻生效,无需重新 install - 如果主项目用了 opcache,要手动
opcache_reset()或重启 PHP-FPM,否则可能看到旧代码 - 如果你在本地包里改了
autoload规则(比如新增命名空间映射),需要运行composer dump-autoload让主项目重新生成自动加载器
本地包的 composer.json 必须有 name 且与主项目 require 一致
这是最容易卡住的地方:主项目 require 的包名(如 "vendor/my-package")必须和本地包根目录下 composer.json 中的 "name" 字段**完全一致**,包括大小写和斜杠方向。不一致会导致 Composer 完全忽略该 path 配置,仍从 Packagist 拉取远程版本。
本地包的 composer.json 至少要包含:
{
"name": "vendor/my-package",
"type": "library",
"autoload": {
"psr-4": {
"Vendor\MyPackage\": "src/"
}
}
}
注意:type 字段虽非强制,但建议设为 "library",避免某些工具(如 Symfony Flex)误判为插件或应用。
开发中遇到 Package not found 或仍走远程源?检查这三点
常见错误现象:明明配了 path,composer install 却提示 Package vendor/my-package not found,或者日志里显示 “Downloading … from https://repo.packagist.org” —— 说明配置没生效。优先排查:
-
repositories块是否写在主项目composer.json的最外层,而不是嵌套在require或其他字段下 - 本地包目录下的
composer.json是否存在、可读,且 JSON 格式合法(可用php -l composer.json验证) - 是否误用了
type: "vcs"或"package"—— 这两种类型不支持本地文件系统路径,只有"path"可以
路径配置本身没有缓存,但 Composer 会缓存 repositories 元数据(如 Packagist 索引)。如果之前试过失败配置,可以临时加 --no-cache 参数重试:composer install --no-cache。


















