Composer 不读取 .env 文件,其 scripts 中的 APP_ENV 由 PHP 脚本(如 artisan)通过 phpdotenv 加载;全局使用 composer 需放至 /usr/local/bin/composer 并赋权;vendor/bin 命令需显式调用或临时加 PATH;global 配置如 process-timeout、secure-http、allow-plugins 等影响安装行为与安全性。

composer install 时读不到 .env 文件里的变量?
Composer 本身不读取 .env 文件,它不是 Laravel 或 Symfony 那类框架——没有内置的环境变量加载机制。你看到的“composer install 用到了 APP_ENV”,其实是项目里自定义的 scripts(比如 post-install-cmd)调用了 PHP 脚本或 artisan 命令,而那些脚本才去加载 .env。
- 直接运行
composer install不会触发任何框架级环境加载逻辑 - 若想在 Composer 脚本中使用环境变量,得靠 shell 层面提前导出,比如
APP_ENV=prod composer install -
.env文件内容只对 PHP 运行时生效(前提是项目代码调用了vlucas/phpdotenv之类库)
Linux 下让 composer 命令全局可用但不污染系统 PATH?
把 composer.phar 放进 /usr/local/bin/composer 是最干净的做法,比改用户级 ~/.bashrc 更稳定,也避免不同 shell(zsh/bash/fish)之间 PATH 不一致的问题。
- 先确认当前用户有
/usr/local/bin写权限:ls -ld /usr/local/bin,若属 root 且无 w 权限,用sudo安装 - 下载后重命名为可执行文件:
sudo mv composer.phar /usr/local/bin/composer - 加执行权限:
sudo chmod +x /usr/local/bin/composer - 验证:
which composer应输出/usr/local/bin/composer,且composer --version可正常执行
别往 ~/.profile 或 ~/.bashrc 里硬加 export PATH="...:$HOME/.composer/vendor/bin"——那是旧版全局 bin 目录,新版 Composer 已弃用该路径,默认用 ~/.config/composer/vendor/bin,而且它只对当前用户生效、重启终端才加载、容易和 IDE 终端环境不一致。
为什么 vendor/bin 下的命令找不到,即使 composer 路径设对了?
这是 PATH 和二进制文件位置错配导致的。Composer 安装的包(比如 phpunit、larastan)生成的可执行文件默认放在项目级 vendor/bin/,不是全局路径的一部分。
- 项目内直接运行:
./vendor/bin/phpunit(推荐,明确、无歧义) - 想全局调用需手动把项目
vendor/bin加入 PATH,但仅建议临时用:export PATH="./vendor/bin:$PATH" - 长期依赖某个工具?用
composer global require phpunit/phpunit,它会放去~/.config/composer/vendor/bin/,再把这个路径加入~/.profile(注意:仅限 CLI 工具,非项目依赖) - IDE(如 PHPStorm)可能缓存旧 PATH,改完要重启 IDE 才能识别新命令
composer config --global 还能设置哪些真正影响行为的变量?
除了常见的 github-oauth,有几个关键配置项直接影响安装逻辑和安全性,但文档里藏得深:
-
process-timeout:默认 300 秒,大项目或慢网络下容易超时,可设为0(不限时)或600;设太小会导致composer update中断并残留半成品 lock -
fxp-asset-installer-enabled:已废弃,但老项目composer.lock里若还残留该字段,会报错;删掉或升级到原生npm-asset-plugin替代方案 -
secure-http:默认true,强制所有仓库用 HTTPS;若私有仓库只有 HTTP,得显式关掉:composer config --global secure-http false(仅限内网环境) -
allow-plugins:Composer 2.2+ 引入,控制哪些插件可运行,默认只允许官方白名单;若某包报The package "xxx" is not allowed to run as plugin,就得手动加:composer config --global allow-plugins.vendor/name true
这些配置都存在 ~/.config/composer/config.json,改之前最好先 cat ~/.config/composer/config.json 看一眼结构,避免格式错误导致整个 Composer 失效。










