config.vendor-dir在composer 2.x+已彻底废弃,必须用环境变量composer_vendor_dir;它优先级最高,对所有命令生效,且需同步更新require路径、bin调用、ide配置和.gitignore。

不能靠改 composer.json 的 config.vendor-dir,它在 Composer 2.x+ 已被移除且会报弃用警告;必须用环境变量 COMPOSER_VENDOR_DIR 才能稳定生效。
为什么 config.vendor-dir 在部署时完全失效
你在本地测试时可能看到它“似乎起作用”,但那是旧版本残留行为或缓存干扰。Composer 2.0+ 明确废弃该配置:运行 composer diagnose 会直接提示 The "config.vendor-dir" option is deprecated。CI/CD 流水线、Docker 构建、PHP-FPM 环境中,这个字段会被静默跳过,所有包仍装进默认 vendor/,导致上线后 require 'vendor/autoload.php' 报错或类找不到。
- 它不参与任何命令逻辑,
composer install -v输出里根本不会提 vendor-dir - 即使你删了旧
vendor并重跑install,只要config.vendor-dir还在composer.json里,就只是多一条警告,路径不变 - 团队协作时,有人用旧版 Composer、有人用新版,行为不一致,排查成本极高
部署时正确设置 COMPOSER_VENDOR_DIR 的三种方式
该环境变量优先级最高,对 install、update、require 全部生效,且无需改项目配置文件。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
Docker 部署:在
Dockerfile中写ENV COMPOSER_VENDOR_DIR=/app/libs,或docker run -e COMPOSER_VENDOR_DIR=/app/libs;确保 PHP-FPM 的env[COMPOSER_VENDOR_DIR]也透传过去 -
CI/CD 脚本(如 GitHub Actions、GitLab CI):在 job 步骤开头加
export COMPOSER_VENDOR_DIR=third-party,并在后续所有composer命令前保持该变量有效 -
PHP-FPM 或 Apache 环境:不能只在 shell 里
export;需在www.conf(PHP-FPM)或envvars(Apache)中显式声明,例如env[COMPOSER_VENDOR_DIR] = /var/www/myapp/third-party
改完路径后必须同步处理的四个硬依赖点
环境变量生效 ≠ 自动加载就通了。以下四点漏掉任意一个,都会在部署后立刻失败:
-
require语句:所有入口文件(index.php、bin/console、public/index.php)里的require 'vendor/autoload.php'必须改成require 'third-party/autoload.php'(路径与COMPOSER_VENDOR_DIR值一致) -
bin目录调用:vendor/bin/phpunit变成third-party/bin/phpunit,CI 脚本、package.json的scripts、部署钩子中所有硬编码路径都要更新 - IDE 和静态分析工具:PHPStorm 的
Include Paths、PHPStan 的autoload_paths、Psalm 的autoloader配置,都得指向新路径,否则类型推导和跳转失效 -
.gitignore:如果原vendor/在忽略列表里,记得把third-party/加进去,避免误提交二进制依赖
最容易被忽略的陷阱:缓存与锁文件残留
部署脚本里只执行 composer install 不够。如果上一次构建用了默认 vendor,而这次设了 COMPOSER_VENDOR_DIR,但没清理历史产物,会出现两个问题:
-
composer.lock文件本身不记录 vendor 路径,但它锁定了包版本和哈希;若旧vendor残留,Composer 可能复用已解压的包,却生成 autoload 映射到新路径——结果是类存在但自动加载器找不到 - 全局缓存(
$COMPOSER_HOME/cache/)里可能存着旧路径的 zip 包或 dist,导致解压目标错乱;建议在部署前加composer clear-cache,或用--no-cache参数
真正干净的部署流程是:rm -rf vendor third-party composer.lock && COMPOSER_VENDOR_DIR=third-party composer install --no-interaction --optimize-autoloader。










