最稳方式是设环境变量COMPOSER_VENDOR_DIR,优先级高于已废弃的config.vendor-dir;-d参数仅改查找路径,不改vendor写入位置。

Composer 没有“包源路径”这个概念,你真正想改的是依赖安装位置(vendor 目录)或单个包的落地路径(如 WordPress 插件进 wp-content/plugins),二者机制完全不同,不能混用。
为什么 composer install -d 不能改 vendor 路径
很多人误以为 composer install -d /path 是用来换安装目录的——它只是告诉 Composer 去哪找 composer.json 和 composer.lock,跟 vendor 写入位置完全无关。执行后包依然落在原项目根目录下的 vendor(或已配置的 vendor-dir)里。
-
-d等价于先cd /path && composer install,路径逻辑没变 - CI 脚本里滥用
-d却不配vendor-dir,是 Class not found 的高频原因 - 真要换位置,必须提前在目标项目的
composer.json里写死config.vendor-dir,或设环境变量
COMPOSER_VENDOR_DIR 和 config.vendor-dir 到底谁生效
优先级:环境变量 > composer.json 配置。但注意,自 Composer 2.0 起,config.vendor-dir 已被标记为废弃,设了会触发警告,且部分命令(如 composer create-project)可能直接忽略它。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 临时改一次:Linux/macOS 运行
COMPOSER_VENDOR_DIR=third-party composer install;Windows 用set COMPOSER_VENDOR_DIR=third-party && composer install - 永久生效:把
COMPOSER_VENDOR_DIR加进系统环境变量(记得重启终端/IDE) -
config.vendor-dir在新项目中尽量别用——它只对旧版 Composer 可靠,且不支持绝对路径(如D:/vendor会失败) - 环境变量方式对
composer dump-autoload也生效,但前提是运行时该变量已存在
怎么让某个包(比如 WordPress 插件)装到指定子目录
这和改整个 vendor 无关,得靠 composer/installers 插件 + extra.installer-paths 配置,且只对声明了特定 type(如 wordpress-plugin)的包生效。
- 先执行
composer require composer/installers - 在
composer.json的extra下加规则,例如:{"installer-paths": {"wp-content/plugins/{$name}/": ["type:wordpress-plugin"]}} - 路径必须相对于项目根目录,不能以
/开头;{$name}会被替换成包名(如akismet) -
monolog/monolog(type: library)永远不会走这条路——它永远进vendor/或你设的全局vendor-dir - 改完要删掉
vendor/和composer.lock再composer install,否则缓存可能导致规则不触发
改完路径后最常漏掉的三件事
Composer 自己能重建 autoload.php 和符号链接,但它不会动你写的任何一行代码、配置或脚本。
-
require 'vendor/autoload.php'必须手动改成require 'third-party/autoload.php'(或用__DIR__ . '/third-party/autoload.php'动态加载) -
vendor/bin/phpunit变成third-party/bin/phpunit,CI 脚本、Makefile、$PATH、Dockerfile 中所有硬编码都得扫一遍 - PHPStorm 默认只索引
vendor/,需手动在 Settings → PHP → Include Paths 中添加新路径,否则自动补全和跳转会失效

















