composer global require 是 require 的全局模式而非独立命令,需先确认 COMPOSER_HOME 决定的安装路径(如 ~/.composer/vendor/bin),再将该绝对路径手动加入系统 PATH 并重载 shell 或重启终端,否则命令无法识别。

composer global require 不是独立命令,而是 require 的全局模式
执行 composer global require laravel/installer 时,global 并非一个可单独调用的子命令(composer global 直接运行会报错),它只是 require 的作用域修饰符:告诉 Composer 把包装进全局 vendor 目录,而非当前项目目录。
关键点在于:global 模式下所有行为都依赖两个环境变量:COMPOSER_HOME(决定装到哪)和系统 PATH(决定能不能敲命令就运行)。两者缺一不可,且顺序不能颠倒——先确认路径,再配 PATH。
-
COMPOSER_HOME必须是绝对路径,含~、$HOME、中文或相对路径都会导致静默失效(Composer 自动回退到默认位置) - 实际二进制文件总在
$COMPOSER_HOME/vendor/bin/,不是$COMPOSER_HOME/bin/,Windows 用户常漏掉\vendor\这一层 - 改完
COMPOSER_HOME后必须新开终端验证,source或setx当前 shell 不继承新值
怎么查真实的全局 bin 路径?别靠记忆或文档
不同系统、不同配置下,~/.composer/vendor/bin 可能根本不存在。唯一可靠方式是让 Composer 自己说:
运行 composer global config bin-dir --absolute,它会输出类似 /home/alex/.my-composer/vendor/bin 或 C:\Users\Alex\AppData\Roaming\Composer\vendor\bin 的真实路径。
这个输出才是你该加进 PATH 的地址。常见错误包括:
- 手动拼写路径时漏掉
vendor/(如写成~/.composer/bin) - Windows 上用了
%APPDATA%\Composer\bin(少\vendor\) - macOS Catalina+ 用 zsh,却把 export 写进
~/.bash_profile,不生效 - Linux 上改了
COMPOSER_HOME,但PATH还指向旧的~/.composer/vendor/bin
PATH 配对了,为什么还是 command not found?
PATH 加对只是第一步。验证是否真正生效,得走两步检查:
先看 PATH 里有没有那个路径:echo $PATH(Linux/macOS)或 echo %PATH%(Windows CMD);再看命令是否被识别:which laravel(Linux/macOS)或 where laravel(Windows)。
如果 echo $PATH 里有路径,但 which 找不到,大概率是以下之一:
- shell 配置文件没重载(zsh 用户要
source ~/.zshrc,bash 用户对应~/.bashrc) - 终端窗口没重启(尤其是 Windows,改完环境变量必须新开命令行)
- 权限问题:
~/.composer所属用户不对(chown -R $USER ~/.composer可修复) - 软链接损坏:进入
$COMPOSER_HOME/vendor/bin/,运行ls -l laravel,看指向是否有效
composer global exec 是临时方案,不是 PATH 的替代品
composer global exec phpunit --version 确实能绕过 PATH 缺失跑起来,但它本质是“模拟执行”,不是真正注册为系统命令。
它的限制很实际:
- 不支持交互式命令(比如
psysh输入后卡住) - 每次都要多打
composer global exec前缀,效率低 - 无法配合 shell 别名、管道或脚本直接调用(
laravel new myapp | grep "success"会失败) - 不解决底层 autoload 或 PHP 版本冲突问题,只是“表面能跑”
真正稳定的用法,永远是确认 bin-dir --absolute 输出、加进 PATH、新开终端验证——三者缺一不可。路径写错、没重载、没重启,任何一个环节出问题,laravel 就只是磁盘上一个文件而已。


















