根本原因是$COMPOSER_HOME/vendor/bin未加入系统PATH,导致终端无法定位laravel等全局命令;需用composer global config bin-dir --absolute查真实路径,再将其添加到PATH并重启终端验证。

composer global require 的命令为什么找不到
根本原因不是安装失败,而是 composer global require 安装的可执行文件(如 laravel、phpstan)被放到了 $COMPOSER_HOME/vendor/bin/,而这个路径没进系统 PATH。终端压根搜不到它,自然报 command not found。
常见错误现象:
- Windows:'
laravel' is not recognized as an internal or external command - macOS/Linux:
zsh: command not found: laravel
解决方式是手动把该目录加进 PATH:
- Linux/macOS:在
~/.zshrc或~/.bashrc末尾加export PATH="$HOME/.composer/vendor/bin:$PATH"(若设过COMPOSER_HOME,则用实际路径替换$HOME/.composer) - Windows:把
%APPDATA%\Composer\vendor\bin加入「系统属性 → 环境变量 → 用户变量 Path」 - 改完后必须新开终端,或运行
source ~/.zshrc(macOS/Linux)
怎么改全局 bin 目录的实际存放位置
COMPOSER_HOME 环境变量决定全局配置、缓存和 vendor/bin 的根位置——它不是可选配置,而是 Composer 启动时第一优先级读取的硬性路径。设了就用,不设就 fallback 到默认值(~/.composer 或 %APPDATA%\Roaming\Composer)。
操作要点:
- 必须使用绝对路径,比如
/opt/my-composer(Linux/macOS)或D:\composer-home(Windows) - 设置后需手动创建
$COMPOSER_HOME/vendor/bin目录(Composer 不自动建) - 必须同步把
$COMPOSER_HOME/vendor/bin加进PATH,否则命令仍不可用 - 已有全局包不会自动迁移,需重新运行
composer global install或手动复制
验证方式:echo $COMPOSER_HOME(Linux/macOS)或 echo %COMPOSER_HOME%(Windows),再确认 echo $PATH 中含对应 vendor/bin 路径。
config bin-dir 对全局命令无效
bin-dir 是项目级配置项,写在 composer.json 的 config 段里,只影响当前项目 vendor/bin 下的符号链接(比如 phpunit),对 composer global require 安装的命令完全不起作用。
有人误以为在全局 config 里设 bin-dir 就能改全局命令路径,这是错的:
-
composer config --global bin-dir /usr/local/bin实际上只是覆盖了“未来新项目”的默认bin-dir值,并不移动已安装的全局二进制文件 - 全局命令的存放路径始终由
$COMPOSER_HOME/vendor/bin决定,与bin-dir无关 - 强行设
bin-dir还可能和bamarni/composer-bin-plugin等插件冲突
Windows 下中文路径容易静默失败
如果 COMPOSER_HOME 设在中文路径下(比如 C:\用户\张三\composer),composer global require 可能成功返回,但生成的可执行文件实际缺失——尤其在启用 bin-compat: full 时,Windows 对中文路径的软链接支持不稳定,会静默跳过。
规避方法:
- 绝对避免将
COMPOSER_HOME设为含中文、空格或特殊符号的路径 - 推荐路径:Windows 用
C:\tools\composer,Linux/macOS 用/opt/composer或$HOME/.local/composer - 设完后检查
$COMPOSER_HOME/vendor/bin下是否有对应可执行文件(如laravel.bat或laravel),别只信命令行输出
最易被忽略的一点:改了 COMPOSER_HOME 后,旧 auth.json 和 config.json 不会自动迁移,得手动拷过去,否则认证失败、镜像失效等连锁问题都会出现。











