composer install 不拉本地包,因为它只按 composer.lock 安装、完全跳过 repositories 解析;必须删 lock 文件后运行 composer update 或 composer require 才能触发本地路径识别。

composer install 本身不加载仓库,也不解析 repositories 配置——它只按 composer.lock 里的记录安装依赖。想让本地相对路径生效,必须先运行 composer update 或 composer require 触发仓库重解析。
为什么 composer install 不拉本地包?
这是最常被误解的点:composer install 是“锁定安装”,完全跳过 repositories 和版本约束求解过程。哪怕你刚在 composer.json 里加了 "type": "path",执行 install 也毫无反应。
- 它只读
composer.lock,把里面记录的包(含来源、版本、checksum)原样复制/链接进vendor/ - 如果 lock 文件里还是 Packagist 的版本,本地路径配置再正确也没用
- 真正触发本地路径识别的是
composer update或首次composer require vendor/name
repositories 配置写在哪?怎么写才有效?
必须写在主项目根目录的 composer.json 顶层 repositories 数组里,不是子包或插件配置文件里。路径是相对于该 composer.json 所在目录,不是 shell 当前路径。
- 正确示例:
"url": "../my-component"(注意用/,Windows 也可用\,但别用单) - 错误写法:
"url": "~/packages/my-component"、"url": "file:///home/user/pkg"、"url": "my-component"(缺少../,会被当成子目录) - 路径指向的必须是完整目录,且内含合法
composer.json;空文件夹、软链接本身、或只有源码没composer.json都会失败
本地包的 composer.json 必须满足什么?
三个硬性条件缺一不可,否则 Composer 静默回退到 Packagist:
-
name字段必须和require中写的字符串完全一致(包括大小写、/方向、连字符),例如"acme/my-component" - 本地包目录必须已
git init,且至少有一次 commit(哪怕只是git commit -m "init") -
require时版本必须写成dev-main、dev-develop这类分支别名,不能写*、^1.0或1.0.x-dev(除非显式配了as映射)
符号链接为啥没生效?
即使路径和配置都对,vendor/ 里仍是复制而非软链,大概率是因为没启用 preferred-install。
- 在主项目
composer.json的config段加:"preferred-install": {"*": "source"} - 或者全局设置:
composer config --global preferred-install source - 注意:
composer install不重建链接,删掉vendor/vendor-name后再跑composer update才会重新 symlink - Windows 用户需确保启用了开发者模式或以管理员权限运行命令行,否则 symlink 创建失败
最容易被忽略的是:改完 repositories 后,必须删掉 composer.lock 或至少删掉对应包的 lock 条目,再跑 composer update ——否则旧记录一直卡在 lock 里,本地路径永远不生效。


















