必须显式声明 repositories 的 type 为 "path" 并确保本地包 composer.json 中 name、路径、version 严格对齐,否则 Composer 将忽略该目录;若需自动加载,还需在本地包中正确配置 autoload(如 psr-4),并执行 composer dump-autoload。

本地包无法被正常 require 或 autoload,不是路径写错了,而是 Composer 根本没把它当“包”处理——必须显式声明 type 和 installer,否则它只会当成普通目录忽略。
为什么 path 仓库的包不进 vendor 目录
Composer 对 path 类型仓库的处理逻辑很特殊:它默认只做符号链接(symlink),不复制文件,也不生成 autoload 映射,除非你同时满足三个条件:
- 仓库 URL 指向的目录里有合法的
composer.json,且其中"type"字段明确设为非library的值(如"wordpress-plugin"、"metapackage") - 你的主项目已通过
composer require composer/installers引入对应 installer -
composer.json的extra.installer-paths中写了完全匹配的包名 + 目标路径(注意大小写、无通配符)
否则,哪怕你写了 "type": "library",它也只 symlink 到 vendor/your-vendor/your-package,但不会触发任何 installer 逻辑,autoload.php 里也不会注册该包的命名空间。
path 仓库必须配 type 和 installer-paths 才生效
想让本地包像远程包一样被自动加载、被正确安装到指定子目录(比如 plugins/my-local-plugin),不能只靠 repositories 声明路径。真实配置长这样:
{
"repositories": [
{
"type": "path",
"url": "./local-packages/my-plugin"
}
],
"require": {
"my-vendor/my-plugin": "*"
},
"extra": {
"installer-paths": {
"plugins/{$name}/": ["my-vendor/my-plugin"]
}
}
}
关键点:
-
my-vendor/my-plugin必须和本地包composer.json里的"name"完全一致(包括大小写) -
installer-paths的值是相对于项目根目录的路径,{$name}是变量,会被替换成包名 - 本地包的
composer.json里必须有"type": "wordpress-plugin"这类非默认 type,否则 installer 不会介入 - 如果只是普通库,别折腾
installer-paths,直接用"type": "library"+autoload配置更稳
本地包用 type: library 时,autoload 怎么配才不报错
大多数内部工具库、通用组件都属于 type: library,这时 installer-paths 失效,但你可以靠 autoload 手动接管:
- 在本地包的
composer.json里写清楚autoload,比如:"autoload": {"psr-4": {"MyVendor\MyPlugin\": "src/"}} - 主项目执行
composer dump-autoload,Composer 会把本地包的映射合并进vendor/composer/autoload_psr4.php - 确保本地包路径可读(Linux/macOS 注意权限,Windows 注意路径是否含空格或中文)
- 不要在主项目的
autoload里重复映射同一命名空间,否则会导致类加载冲突
这种模式下,包仍会以 symlink 形式出现在 vendor/ 下,但类能正常加载——这才是 path 仓库最常用、最不容易翻车的方式。
path 仓库的 symlink 行为不可关闭,也不能改用 copy
这是最容易踩的坑:很多人以为加个 "options": {"symlink": false} 就能强制复制文件,但 Composer 2.x 官方不支持这个配置项,所有类似写法都会被静默忽略。
-
path类型仓库永远走 symlink,这是硬编码行为,没有开关 - 如果你需要真实复制(比如部署到无 symlink 权限的环境),只能换方案:用
package类型仓库 +dist源,或者 CI 脚本里手动cp -r - Windows 上 symlink 需要管理员权限或开发者模式开启,否则
composer install会失败并提示failed to create symbolic link - IDE(如 PHPStorm)可能不跟随 symlink,默认只索引
vendor/下的真实文件,需手动开启 “Follow symlinks” 选项
真正可控的只有两件事:本地包自己的 autoload 配置,以及主项目是否把它 require 进来。其他所谓“安装选项”,基本都是幻觉。











