composer_home环境变量唯一决定全局配置、缓存及插件安装路径,设则使用、不设则回退默认路径(linux/macos为~/.composer,windows为%appdata%\roaming\composer);它非可选配置,而是composer启动时优先读取的权威路径。

COMPOSER_HOME 决定全局配置与缓存位置
Composer 的全局行为(如 composer global require、插件安装、auth 配置)只认 COMPOSER_HOME 环境变量指向的目录。它不是“可选配置”,而是运行时唯一生效的权威路径。
Linux/macOS 下默认是 ~/.composer,Windows 是 %APPDATA%\Roaming\Composer。改它,就等于重定向整个全局生态——但注意:这不改变项目级 vendor/ 位置。
- 必须设为绝对路径,比如
/opt/my-composer-home或D:\composer-global - 设置后要重启终端或重新加载 shell 配置(
source ~/.zshrc),否则echo $COMPOSER_HOME看不到变化 -
composer config --global home只是写进配置文件的值,不覆盖环境变量;两者不一致时,环境变量永远优先 - 旧数据不会自动迁移,需手动复制
~/.composer/*到新目录,并确保auth.json权限为600(Linux/macOS)
COMPOSER_VENDOR_DIR 只对项目有效,且仅在 composer.json 中声明才起作用
COMPOSER_VENDOR_DIR 环境变量在 Composer 2.x 中已被移除或静默忽略——它**不再控制任何安装路径**。网上很多教程仍提它,属于过时信息。
真正能改项目 vendor/ 目录名或位置的,只有项目根目录 composer.json 里的 config.vendor-dir 字段。这个字段必须满足三个硬性条件:
- 写在
composer.json最外层的config对象下,不能错放到extra或缩进错误 - 值必须是相对路径,如
"libs"或"third-party",不能以/开头,也不支持$HOME或通配符 - 运行
composer install前,必须先删除旧vendor目录;composer update不会迁移已有包
用 path 类型仓库时,url 必须是相对路径,且不能带 file://
想把本地包当依赖引入,常会写 repositories 配置。但 type: "path" 的 url 极其敏感:它只接受相对于项目根目录的路径,且格式严格。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
正确写法:"./packages/my-utils";错误写法包括:"/home/user/project/packages/my-utils"、"file:///home/user/project/packages/my-utils"、"/packages/my-utils"——这些都会被 Composer 静默跳过,不报错也不提示。
- 验证是否可达:在项目根目录执行
ls -la ./packages/my-utils,能列出内容才算有效 - 本地包的
composer.json中name字段必须与require中的包名完全一致(大小写敏感) -
repositories必须放在项目composer.json的根级数组中,不能嵌套在extra或其他字段里
installer-paths 不是包名路由表,而是 type 分发器
extra.installer-paths 经常被误认为“按包名指定安装路径”,但它实际只对声明了特定 type 的包生效,且依赖对应 installer 插件。
比如你写了 "wp-content/plugins/{$name}/": ["acme/my-plugin"],但 acme/my-plugin 的 composer.json 里没写 "type": "wordpress-plugin",这条规则就完全不触发。
- 必须已通过
composer require composer/installers引入 installer(v2.0+) - 目标包自身
composer.json必须声明匹配的type,普通library类型永远走默认vendor/ - 路径值中
{$name}是占位符,会被替换成包名最后一段(如acme/my-plugin→my-plugin) - 改完必须删掉整个
vendor和composer.lock,再跑composer install;已有包不会被重排
最易被忽略的一点:所有路径变更都要求同步更新代码中硬编码的 require 'vendor/autoload.php'、IDE 的 include paths、CI 脚本里的 vendor/bin/phpunit,以及 bin-dir 配置——漏掉任意一环,都会在部署或开发时突然失效。










