Composer install 不会自动识别本地路径包,因默认仅从 packagist.org 或配置仓库拉取已发布版本;需在 repositories 中声明 path 类型仓库,require 中用 dev-xxx as 伪版本,并执行 composer update 和 dump-autoload -o 刷新 autoload 映射。

为什么 composer install 不会自动识别本地路径包?
因为 Composer 默认只从 packagist.org 或你配置的仓库拉取已发布版本,即使你在 composer.json 里写了本地路径,它也不会主动链接——除非你明确告诉它“这个包是开发态的”。否则你改了依赖库的代码,主项目 vendor/ 里还是旧的 zip 包或 tag 版本。
用 path 仓库类型让 Composer 认出本地目录
在主项目的 composer.json 的 repositories 字段里加一条 path 类型仓库,指向你 fork 并 checkout 了 PR 分支的本地目录:
{
"repositories": [
{
"type": "path",
"url": "../my-forked-package"
}
],
"require": {
"vendor/package": "dev-main as 1.2.3"
}
}
关键点:
-
url必须是相对或绝对文件系统路径,不能是 Git URL -
require中的版本号要写成dev-xxx(对应分支名),并用as伪版本对齐主项目依赖约束 - 执行
composer update vendor/package,不是install——否则 Composer 可能跳过更新
符号链接生成后为何还加载不到新代码?
Composer 确实会创建 symlink,但 PHP 自动加载器(如 Composer 的 ClassLoader)默认只扫描 vendor/composer/autoload_*.php 里的映射表,而 path 包的类路径不会自动加入——除非你触发重生成。
必须运行:
composer dump-autoload -o
否则哪怕 symlink 存在,new SomeClass() 仍会报 Class not found。这个步骤常被跳过,尤其在 CI 或 Docker 环境里没显式调用时。
测试完想切回稳定版?别只删 vendor/
直接删 vendor/ 再 install 很慢,且容易残留 symlink。更稳妥的做法是:
- 删掉
repositories里那条path配置 - 把
require改回真实版本,比如"vendor/package": "^1.2" - 运行
composer update vendor/package
这样 Composer 会自动移除 symlink,并替换为正常安装的 dist 包。硬删 vendor/ 在大型项目中可能引发 autoload 映射错乱,特别是用了 classmap 或 psr-4 混合配置时。
真正麻烦的不是加链接,而是 autoload 映射没刷新、或是 path 仓库的版本约束和主项目冲突导致 Composer 拒绝切换——这两个点不检查,PR 测试就永远卡在“改了但没生效”。


















