根本原因是composer global安装的可执行文件路径未加入系统path环境变量,导致命令找不到;需手动将bin-dir绝对路径添加到path并确保权限属当前用户。

composer global require 为什么装不上包
根本原因不是命令写错了,而是 composer global 默认把包装进 ~/.composer/vendor/bin/,但这个路径通常不在系统 $PATH 里。你执行 composer global require laravel/installer 看似成功,一敲 laravel 就报 command not found。
- 检查是否生效:运行
composer global show能列出已装包,说明安装本身没问题 - 确认 bin 目录位置:执行
composer global config bin-dir --absolute,得到真实路径(可能是~/.composer/vendor/bin或~/Library/Application Support/Composer/vendor/bin,macOS Catalina+ 常见后者) - 必须手动加进
$PATH:比如用 zsh 就在~/.zshrc末尾加export PATH="$HOME/.composer/vendor/bin:$PATH",然后source ~/.zshrc - Windows 用户注意:
composer global的 bin 目录默认在%USERPROFILE%\AppData\Roaming\Composer\vendor\bin,需通过「系统属性 → 高级 → 环境变量」添加到用户或系统 Path
global install 后命令找不到的常见错误现象
最典型的是装完 laravel/installer 或 phpunit/phpunit,终端直接报 bash: laravel: command not found,或者提示 Permission denied —— 后者往往是因为 bin 目录权限不对,或用了 sudo composer global 导致文件属主混乱。
- 别用
sudo composer global:这会让 bin 下文件归 root 所有,普通用户无法执行 - Mac 上遇到
Operation not permitted:是 SIP 保护了/usr/local/bin,别硬链过去;老老实实改自己的$PATH - 装完重开终端没用?先跑
echo $PATH确认新加的路径真在里头,再查which laravel看有没有命中 - 某些包(如
deployer/deployer)会生成多个可执行文件,dep和dep.phar都可能,优先用前者
composer global 和项目本地 require 的关键区别
composer global 是全局工具链,和当前项目无关;composer require 是项目依赖,只对当前 vendor/ 有效。两者混用容易出问题,比如全局装了 phpunit,但项目里又 require phpunit/phpunit:^10,结果跑测试时实际用的是全局旧版。
- 全局只适合装 CLI 工具类包:如
laravel/installer、deployer/deployer、hirak/prestissimo(加速插件) - 绝不该用 global 装框架、组件、ORM 这类运行时依赖——它们必须随项目锁定版本
- global 包升级要主动执行
composer global update,不会随项目composer update一起动 - PHP 版本切换(如 via
phpbrew或asdf)后,global 包可能失效,因为composer二进制指向的 PHP 解释器变了
Windows 下 composer global 的兼容性坑
Windows 的路径分隔符、权限模型和 shell 行为跟 Unix 完全不同,composer global 在这里更容易卡住。
- PowerShell 中执行
composer global require后,新命令可能不被识别——换用 CMD 或 Git Bash 再试 - 防病毒软件(尤其 McAfee、Symantec)会拦截
.bat文件生成,导致 bin 目录下只有xxx.bat没有对应xxx可执行文件 - Composer 安装器自带的
composer.bat如果放在C:\ProgramData\ComposerSetup\bin\,和 global bin 冲突,建议删掉或重命名 - 用 WSL?别在 Windows 侧配 global,统一在 WSL 里装,且确保 WSL 的
$PATH包含~/.composer/vendor/bin
$PATH,权限得是当前用户。其他所有报错,基本都是这两点漏了哪一环。










