composer全局路径唯一由composer_home环境变量决定,设则强制使用、不设则回退默认路径(linux/macos为~/.composer,windows为%appdata%\roaming\composer);composer_vendor_dir仅控制项目vendor目录位置,且必须用绝对路径或合法相对路径,改后需删除vendor和composer.lock并重装。

Composer 没有“默认路径”可改,只有 COMPOSER_HOME 和 COMPOSER_VENDOR_DIR 两个环境变量真正起效——设错一个,全局命令就失效、vendor 就装错地方、autoload 就报 Class not found。
为什么 composer config --global home 不生效
这个命令只是往 $COMPOSER_HOME/config.json(或默认路径下的配置文件)里写了一行值,它不改变 Composer 运行时行为。真正被读取的是环境变量 COMPOSER_HOME,优先级永远高于配置项。
- 常见现象:
composer config --global home输出新路径,但echo $COMPOSER_HOME仍是旧值 → 插件不加载、composer global list空或报错 - Linux/macOS 必须把
export COMPOSER_HOME="/path/to/composer"写进~/.zshrc或~/.bash_profile,然后source或新开终端 - Windows PowerShell 要用
[Environment]::SetEnvironmentVariable("COMPOSER_HOME", "D:\my-composer", "User"),CMD 用setx COMPOSER_HOME "D:\my-composer",改完必须重启终端 - 旧数据不会自动迁移:需手动复制
~/.composer/*到新目录,并确保auth.json权限为600(Linux/macOS)
COMPOSER_VENDOR_DIR 是改项目 vendor 路径的唯一可靠方式
composer.json 里的 "config": {"vendor-dir": "lib/vendor"} 在 Composer 2.0+ 已被彻底废弃,运行时会触发弃用警告且完全不生效。现在只认环境变量。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 临时改:运行前加前缀,如
COMPOSER_VENDOR_DIR=third-party composer install - 永久改:Linux/macOS 加
export COMPOSER_VENDOR_DIR="/var/www/myapp/libs"到 shell 配置;Windows 加系统环境变量 - 路径可以是相对路径(
third-party)或绝对路径(/opt/myproject/vendor),但别用/third-party这种伪绝对路径,Windows 下可能解析失败 - 改完后必须删掉整个
vendor目录和composer.lock,再跑composer install,否则 autoload.php 仍指向旧路径
改了路径后哪些地方会断,怎么修
vendor 目录一动,所有硬编码路径的地方都会失效,不是 Composer 的 bug,是设计使然。
-
require 'vendor/autoload.php'必须同步改成新路径,比如require 'third-party/autoload.php' - bin 文件(如
phpunit)默认链到vendor/bin/,若 vendor 移走了但没配bin-dir,链接就断了 → 在composer.json中补上"bin-dir": "third-party/bin" - PHPStorm 默认只索引
vendor,需手动在Settings → PHP → Include Paths添加新路径 - CI/CD 脚本里写的
vendor/bin/phpunit或php -d vendor/autoload.php全部要更新,漏一个就失败 -
composer dump-autoload不解决路径问题,它只刷新类映射,不重建autoload.php引导逻辑
最易忽略的点:Web 服务器(如 PHP-FPM)启动时不会继承你 shell 里 export 的环境变量,COMPOSER_VENDOR_DIR 必须在服务启动前注入(比如写进 systemd service 文件或 Dockerfile 的 ENV),否则请求里看到的仍是默认 vendor/。










