答案:本地包不被识别的根本原因是repositories未在项目根目录composer.json的根级repositories数组中正确定义,子模块自身composer.json中的配置完全无效。必须将type为"path"、url为相对路径(如"modules/user")的仓库条目写在主项目根composer.json的repositories数组中,且本地包目录下需有含合法name字段(如"myorg/user")的composer.json,并已完成git init和首次commit。

composer.json里写错repositories位置,本地包根本不会被识别
本地模块(比如 modules/user)自己的 composer.json 中加 repositories 字段完全无效。Composer 只扫描项目根目录的 composer.json,且只认最外层 repositories 数组里的条目。
常见错误是把 path 配置塞进 modules/user/composer.json,结果 composer install 一声不吭,报 Could not find a matching version of package myorg/user——这不是网络问题,是压根没注册源。
- 必须在项目根目录
composer.json的repositories数组中显式声明,例如:{ "repositories": [ { "type": "path", "url": "modules/user" }, { "type": "path", "url": "modules/payment" } ], "require": { "myorg/user": "dev-main", "myorg/payment": "dev-main" } } -
url必须是相对于根目录composer.json的路径,不能用~/、$HOME或绝对路径 - 每个模块目录下必须有合法
composer.json,其中name字段(如"myorg/user")要和require中完全一致,大小写敏感 - 模块目录需已执行
git init并至少有一个 commit,否则 Composer 拒绝加载
想改 vendor 目录位置,只靠 config.vendor-dir 就够了
config.vendor-dir 是唯一真正生效的全局 vendor 路径配置方式。其他所有方法——包括环境变量 COMPOSER_VENDOR_DIR(Composer 2.x 已废弃)、命令行参数、全局配置——都会被忽略。
它必须满足三个硬性条件才能起作用:
- 写在项目根目录
composer.json的最外层config字段下,不能缩进错位、不能塞进extra或scripts - 值必须是相对路径(如
"libs"),不能以/开头,也不支持波浪号或环境变量 - 运行
composer install前,必须手动删除旧的vendor目录;composer update不会迁移已有包
改完后,autoload.php、可执行文件路径、自动加载映射全都会生成到新位置,但 PHP 代码里所有 require 'vendor/autoload.php' 都得手动改成新路径,IDE 和 CI 脚本同理。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
extra.installer-paths 写了没反应?不是语法问题,是条件没凑齐
extra.installer-paths 不是“按包名重定向安装路径”的通用开关,它只对声明了特定 type 并启用了对应 installer 的包生效。
普通库("type": "library")哪怕写进规则里,也照旧进 vendor。这是最容易踩的坑。
- 项目必须已通过
composer require composer/installers引入 installer(且版本 ≥ 2.0) - 目标包自己的
composer.json中必须明确声明匹配的type(如"wordpress-plugin"),普通包默认type是library,不触发 - 必须删掉整个
vendor目录和composer.lock,再跑composer install—— 它不会重排已有包 - 路径中
{$name}是占位符,会被替换成包名最后一段(如acme/my-plugin→my-plugin),不能用通配符写成"myorg/*"
让本地模块修改实时生效,必须启用 symlink
默认情况下,Composer 对 path 类型仓库走的是 copy 模式:你改了 modules/user/src/Helper.php,vendor/myorg/user/src/Helper.php 还是旧文件。
要实时同步,必须显式启用符号链接:
- 在主项目
composer.json的对应repositories条目里加"options": {"symlink": true} - 或者,在本地模块自己的
composer.json里加同样字段(效果等价) - 执行
composer update myorg/user(不是dump-autoload),才会重建 symlink - 验证:Linux/macOS 下
ls -la vendor/myorg/user应显示箭头指向源目录;Windows 下需开启开发者模式或以管理员权限运行命令行,否则 symlink 创建会静默失败
路径配置本身不难,难的是每个环节都依赖前序条件成立——比如没 git commit 的模块目录,即使 repositories 写对了也加载失败;又比如 config.vendor-dir 改了但没删旧 vendor,结果新旧路径混用导致 autoload 错乱。这些点一旦漏掉一个,整套配置就卡在“看似配了,实际没用”上。










