Composer只识别COMPOSER_开头的环境变量(如COMPOSER_HOME),必须为绝对路径、进程启动前设置且重启终端才生效;它不读取.env文件或shell环境变量,全局命令需手动将$COMPOSER_HOME/vendor/bin加入PATH。

Composer 本身不读取 .env 文件,也不自动继承 shell 环境变量;它只认以 COMPOSER_ 开头的环境变量(如 COMPOSER_HOME),且这些变量必须在进程启动前就存在,否则 PHP 子进程(比如脚本或插件)根本拿不到。
COMPOSER_HOME 路径必须绝对、重启终端才生效
这个变量决定全局配置、缓存、插件和 vendor/bin 的存放位置。设错会导致 composer global require 把命令装进错误目录,后续所有全局命令都“找不到”但无提示。
- 不能含
~、$HOME、%USERPROFILE%—— 比如~/composer或%APPDATA%\Composer是无效写法 - Linux/macOS 正确示例:
export COMPOSER_HOME="/home/yourname/.my-composer"(加到~/.zshrc或~/.bashrc) - Windows 正确示例(用户级):
setx COMPOSER_HOME "C:\Users\YourName\AppData\Roaming\Composer" - 设完必须新开终端(
source ~/.zshrc不够,因为 Composer 启动时读的是 shell 初始化前的环境) - 验证方式:
composer config --list --global,第一行 “Global configuration file” 路径必须与你设的一致
PATH 必须显式包含 $COMPOSER_HOME/vendor/bin
Composer 从不修改系统 PATH。它只把 laravel、phpunit 这类全局命令放进 $COMPOSER_HOME/vendor/bin,剩下的全靠你自己加进 PATH。
- Linux/macOS:在 shell 配置文件末尾加
export PATH="$COMPOSER_HOME/vendor/bin:$PATH"(注意顺序,放前面防覆盖) - Windows:把
%COMPOSER_HOME%\vendor\bin(不是%APPDATA%\Composer\vendor\bin!除非你没设COMPOSER_HOME)加进「系统属性 → 高级 → 环境变量」里的用户 PATH - 加完后必须新开 CMD/PowerShell/终端;用
echo %PATH%或echo $PATH确认路径已出现 - 验证命令是否真指向该目录:
where laravel(Windows)或which laravel(Linux/macOS)
composer 命令本身找不到?查 where composer 和安装路径
报 “不是内部或外部命令” 不是 Composer 没装好,而是系统压根找不到 composer.bat 或可执行文件。
- Windows 官方安装器默认路径是
C:\ProgramData\ComposerSetup\bin\,里面必须有composer.bat和composer.phar - 运行
where composer:如果无输出,说明 PATH 没加对,或安装被 UAC 拦截失败 - 别把
php.exe所在目录加进 PATH 来“凑合”——那是 PHP 的路径,不是 Composer 的 - 手动下载
composer.phar的话,要建一个同目录的composer.bat:@echo off php "%~dp0composer.phar" %*
,再把该目录(如C:\tools\composer)加进 PATH - PATH 加完后一定要新开终端,旧窗口不会刷新环境变量
脚本里读不到 getenv('APP_ENV')?因为 PHP 进程没继承 shell 变量
你在 shell 里 export APP_ENV=prod,然后跑 composer install,项目里的 PHP 脚本仍可能读不到——这不是 .env 文件问题,是环境变量没透传进子进程。
- Composer 自身脚本(如
post-install-cmd)默认不继承父 shell 的$_ENV - 正确做法是用 shell 层面提前注入:
APP_ENV=prod composer install(Linux/macOS)或set APP_ENV=prod && composer install(Windows CMD) - 或者在
composer.json的支持字段中使用${APP_ENV}占位符(仅限config.http-basic、repositories[].url等明确支持插值的字段) -
vendor/autoload.php不负责加载环境变量,它只管类自动加载;.env 文件由框架(如 Laravel)通过vlucas/phpdotenv在应用启动时加载,与 Composer 无关
最容易被忽略的点是:COMPOSER_HOME 和 PATH 的路径必须完全匹配,且两者都要在新终端中验证;任何一处用了相对路径、环境变量占位符或未重启终端,都会导致“命令找不到”却查不出原因。











