composer不读取项目.env文件或app_env等系统环境变量,仅识别composer_home、composer_cache_dir等以composer_开头的专用变量;其他变量需手动导出才在scripts中生效。

Composer 本身不读取项目 .env 文件,也不解析系统级环境变量(如 APP_ENV)来控制自身行为;它只认以 COMPOSER_ 开头的专用环境变量,比如 COMPOSER_HOME、COMPOSER_CACHE_DIR。其他变量(包括你 export APP_ENV=prod 的)对 composer install 无直接影响。
为什么 composer install 读不到 .env 里的 APP_ENV
这是最常被误解的一点:Composer 不是 Laravel 或 Symfony,它没有内置的 dotenv 加载逻辑。你在 composer.json 的 scripts 里看到的 APP_ENV,实际来自 shell 层面提前导出的变量,或由后续调用的 PHP 脚本(如 artisan)加载 .env 后才生效。
- 直接运行
composer install时,APP_ENV是空的 —— 即使.env存在且内容正确 - 若想在 scripts 中使用,必须显式导出:
APP_ENV=prod composer install或在 shell 中先export APP_ENV=prod - 框架级环境变量(如
APP_ENV、DB_HOST)只对 PHP 运行时有效,前提是项目代码主动调用了vlucas/phpdotenv等库
COMPOSER_HOME 和 COMPOSER_CACHE_DIR 怎么设才生效
这两个是 Composer 官方唯一真正识别的环境变量,用于控制其自身存储路径。设错会导致全局配置丢失、缓存失效、composer global require 安装的命令找不到。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
COMPOSER_HOME必须是绝对路径,不能含~、$HOME或%USERPROFILE%;Linux/macOS 建议用/home/username/.composer,Windows 用C:\Users\Username\AppData\Roaming\Composer -
COMPOSER_CACHE_DIR可独立设置,比如指向 SSD 分区加速下载:COMPOSER_CACHE_DIR="/mnt/ssd/composer-cache" - 设完必须重启终端(或重新登录),否则旧进程仍读旧值;验证方式:
composer config --list --global,看 “Global configuration file” 路径是否匹配 - Windows 用户注意:系统变量和用户变量要分清;若用 PowerShell,改完后还需运行
$env:COMPOSER_HOME="C:\path"才能立即生效(仅当前会话)
PATH 没配对,composer 命令就永远找不到
“command not found” 错误 90% 是 PATH 问题,不是 Composer 本身坏了。关键要分清三类路径:Composer 自身可执行文件位置、全局 bin 目录、项目 vendor/bin 目录 —— 它们互不替代。
- Composer 主程序(
composer.phar或composer.bat)路径必须加入 PATH:Linux/macOS 推荐/usr/local/bin/composer,Windows 默认是C:\ProgramData\ComposerSetup\bin - 全局安装的命令(如
laravel、phpunit)放在COMPOSER_HOME/vendor/bin,这个目录也得加进 PATH;Linux/macOS 在~/.zshrc里加export PATH="$COMPOSER_HOME/vendor/bin:$PATH",Windows 加%APPDATA%\Composer\vendor\bin - 项目级命令(如
./vendor/bin/phpunit)不依赖 PATH,直接调用最安全;别为了图省事把./vendor/bin加进 PATH —— 切换项目时容易冲突 - Windows 用户额外注意:
echo %PATH%必须看到你加的路径;若用了 Scoop/Chocolatey,where composer可能返回多个结果,优先确认第一个是否是你想要的
脚本里怎么安全拿到 vendor 目录路径
$COMPOSER_VENDOR_DIR 并不是 Composer 自动注入的环境变量,文档里提到它,但 scripts 中直接引用会为空。硬编码 ./vendor 更危险 —— 项目若自定义了 "config": {"vendor-dir": "lib/vendor"},就会出错。
- 推荐方式:在
composer.json的scripts里用命令动态查:"show-vendor": "echo \"Vendor dir: $(composer config vendor-dir)\"" - PHP 脚本中获取:用
getcwd() . DIRECTORY_SEPARATOR . (new Composer\Config())->get('vendor-dir'),或更简单地读composer.json解析config.vendor-dir字段 -
$COMPOSER_BIN_DIR是安全可用的,它默认等于vendor/bin,但若用了--bin-dir参数安装,它会自动反映真实路径 - 别信
$COMPOSER_HOME能推导出 vendor 路径 —— 全局和项目 vendor 是两套体系,COMPOSER_HOME下的vendor只用于composer global包
最易忽略的其实是变量作用域:shell 导出的 COMPOSER_HOME 对子进程有效,但 PHP 脚本里拿不到,除非你显式用 putenv() 或通过 $_SERVER 传入;而 composer.json 的 scripts 是在 shell 环境下执行的,所以 $COMPOSER_HOME 在那里可用,但 $APP_ENV 不可用 —— 除非你手动导出。










