composer扩展包默认只能装入vendor/目录,-d参数仅指定composer.json读取路径而不改变安装位置;真正生效的vendor-dir配置必须写在composer_home/config.json中并预先设置composer_home环境变量。

Composer 扩展包默认只能装进 vendor/ 目录,不能靠命令行参数或项目级配置“临时改路径”——你看到的 composer install -d 或 config.vendor-dir 写在项目 composer.json 里,基本都无效。
为什么 composer install -d /path 不改变安装位置
-d 参数只影响 Composer 去哪读 composer.json 和 composer.lock,它完全不控制写入目标。执行 composer install -d /tmp/myapp 等价于 cd /tmp/myapp && composer install,包依然会装进 /tmp/myapp/vendor/(或该目录下已配置的 vendor-dir)。很多人在 CI 脚本里加了 -d 却没配 vendor-dir,结果部署后 require 'vendor/autoload.php' 报错,就是因为 PHP 还在找原路径。
真正生效的 vendor-dir 配置只有一种写法
必须满足两个硬性条件:
-
config.vendor-dir必须写在COMPOSER_HOME/config.json(Linux/macOS)或%COMPOSER_HOME%\config.json(Windows)里,不是项目根目录的composer.json -
COMPOSER_HOME环境变量必须提前设好,例如export COMPOSER_HOME="/opt/composer-global"
配置示例(/opt/composer-global/config.json):
{"config": {"vendor-dir": "/opt/shared-vendor"}}
之后所有 composer install 都会把包装进 /opt/shared-vendor。注意:这会让所有项目共用同一份依赖,适合内部工具链,但不适用于需要隔离版本的多项目开发。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
想让特定类型包(如 WordPress 插件)进自定义目录
必须用 composer/installers 插件 + extra.installer-paths,且仅对声明了支持 type 的包有效:
- 先运行
composer require composer/installers - 确保你要重定向的包在它自己的
composer.json中有"type": "wordpress-plugin"(或其他composer/installers支持的类型) - 在主项目
composer.json的extra段写:
"extra": {
"installer-paths": {
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"],
"app/extensions/{$name}/": ["myvendor/custom-package"]
}
}
⚠️ 普通 library 类型包(比如 monolog/monolog)无法被重定向,installer-paths 对它完全不匹配。
改路径后最常漏掉的三件事
哪怕 vendor-dir 配置成功,以下环节也必须手动同步,否则立刻报错:
-
require 'vendor/autoload.php'得改成新路径,比如require 'third-party/autoload.php' -
bin-dir必须显式配置,否则phpunit、laravel-zero这类二进制文件不会生成在新位置,例如:"bin-dir": "third-party/bin" - IDE(如 PHPStorm)默认只索引
vendor/,需手动在Settings → PHP → Include Paths中添加新路径
改路径不是改一个配置就完事,它是牵一发而动全身的操作。最容易出问题的不是配置本身,而是后续所有对 vendor/ 的硬编码引用——它们不会自动更新。










