config.vendor-dir在composer 2.0+中已彻底移除,无效且触发弃用警告;唯一可靠方式是设置环境变量composer_vendor_dir,它优先级最高,对install、update、require等所有命令均生效。

Composer 2.0+ 中,config.vendor-dir 已被彻底移除,写在 composer.json 里不仅无效,还会触发弃用警告:The "config.vendor-dir" option is deprecated, use the "COMPOSER_VENDOR_DIR" environment variable instead. 真正可靠、全命令生效的方式只有一种:用环境变量 COMPOSER_VENDOR_DIR。
为什么 config.vendor-dir 在 Composer 2.x 里不生效
它不是“偶尔失效”,而是被官方主动删除。Composer 启动时会直接跳过该配置项,连解析都不做。你改了 composer.json 里的 "vendor-dir": "libs",运行 composer install 后包依然进 vendor/,且 composer diagnose 会明确报出弃用提示。旧教程里复制的 JSON 片段,在当前版本属于无效代码。
COMPOSER_VENDOR_DIR 怎么设才真正起作用
这个环境变量优先级最高,对 install、update、require 全部命令都生效,且不依赖项目是否存在 composer.json。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- Linux/macOS:运行前加前缀,如
COMPOSER_VENDOR_DIR=third-party composer install - Windows CMD:
set COMPOSER_VENDOR_DIR=third-party && composer install - PowerShell:
$env:COMPOSER_VENDOR_DIR="third-party"; composer install - Docker 中建议用
ENV COMPOSER_VENDOR_DIR=/app/third-party或docker run -e COMPOSER_VENDOR_DIR=third-party ... - 路径支持相对(
third-party)或绝对(/var/www/myapp/libs),但避免以/开头的“伪绝对路径”(如/third-party),Windows 下易解析失败
改完路径后哪些地方必须同步更新
vendor 目录一动,整个依赖链的锚点就变了。以下几处不改,立刻报错:
-
require 'vendor/autoload.php'必须改成require 'third-party/autoload.php'(所有 PHP 文件里都要搜替换) - CI/CD 脚本、部署命令中硬编码的
vendor/bin/phpunit得换成third-party/bin/phpunit - IDE(如 PHPStorm)默认只索引
vendor,需手动在Settings → PHP → Include Paths中添加新路径 - 如果用了
bin-dir自定义可执行文件位置,必须确保它和新 vendor 路径一致;否则composer require安装的 bin 工具不会出现在新目录下
别踩 -d 参数的坑
composer install -d /path 的 -d 只是告诉 Composer 去哪找 composer.json 和 composer.lock,完全不影响 vendor 写入位置。它等价于 cd /path && composer install。很多人在 CI 里误用这个参数,结果本地跑通、流水线报 Class not found——根本原因就是只换了工作目录,没配 COMPOSER_VENDOR_DIR。
环境变量方式看似简单,但最容易被忽略的是 Web 服务器上下文:PHP-FPM 或 Apache mod_php 不会自动继承 shell 里 export 的变量,必须在服务启动前注入(比如 systemd service 文件里加 Environment=COMPOSER_VENDOR_DIR=...),否则 Web 请求里 require 还是找不到 autoload。










