Composer需通过path repository配置本地包,要求本地包composer.json的name与require完全一致,且url为相对路径;install后vendor中为符号链接以实现热更新,需确保symlinks启用及系统支持;require-dev包同样需单独配置path repository。

本地包怎么用 path repository 配置映射
Composer 本身不支持直接写 vendor/xxx/yyy 这种路径引用,必须通过 path 类型的 repository 声明本地目录为可安装源。关键点是:该目录下必须有合法的 composer.json,且其中 name 字段要和你 require 的包名完全一致(包括 vendor 名)。
在项目根目录的 composer.json 中添加:
{
"repositories": [
{
"type": "path",
"url": "../my-local-package"
}
],
"require": {
"acme/my-local-package": "*"
}
}
注意:url 是相对于当前 composer.json 文件的路径,不是相对于项目根目录或 shell 当前路径;"*" 会匹配本地包 composer.json 中的 version(建议设为 "dev-main" 或 "dev-develop"),不要写成 "dev-master"——除非你真有 master 分支且 version 对应。
为什么 install 后 vendor 里是 symlink 而不是复制文件
这是 path repository 的默认行为,也是调试本地包的核心优势:改本地源码,项目里立刻生效,不用反复 composer update。但前提是满足两个条件:
-
composer.json中config.symlinks没被设为false - 你的系统支持符号链接(Linux/macOS 默认支持;Windows 需启用开发者模式或以管理员身份运行终端)
如果发现 vendor 里是拷贝而非软链,先检查是否因权限问题 fallback 到 copy 模式,再确认 config.symlinks 是否被全局或项目级配置覆盖:
composer config --list | grep symlinks
临时关闭 symlink(仅用于排查):composer config --global symlinks false,但调试阶段强烈建议保持开启。
require-dev 包怎么也走本地路径
很多人只给主依赖配了 path,结果测试工具类包(如 phpunit/phpunit 或自定义的 acme/test-helpers)仍从 packagist 下载。解决方法是:把它们也加进 repositories 数组,且 require-dev 中的包名必须和本地包 composer.json 的 name 完全一致。
常见错误:
- 本地包
composer.json写了"name": "acme/test-helper",但require-dev写的是"acme/test-helpers"(少个 s) - 本地包没声明
autoload,导致composer dump-autoload后类找不到,误以为映射失败 - 用了
minimum-stability: dev却漏了prefer-stable: true,导致 Composer 优先选 packagist 上的稳定版而非本地dev-版本
修改本地包后 vendor symlink 没更新怎么办
symlink 不会自动刷新——它指向的是本地目录,内容变,链接本身不变。但如果你改了本地包的 composer.json(比如 version、autoload),需要让 Composer 重新解析依赖图:
- 改完本地包
composer.json后,回到项目根目录执行:composer update acme/my-local-package --no-install(只更新 lock,不重装) - 再执行:
composer install,触发 symlink 重建 - 如果只是改 PHP 源码,不需要任何命令——只要 symlink 存在,就直接生效
最容易被忽略的是:IDE(如 PHPStorm)可能缓存了旧的 autoload 映射,需手动触发 Reload project 或清空 vendor/composer/autoload_*.php 后再 dump-autoload。










