COMPOSER_NO_SCRIPTS=1 无效,必须显式使用 --no-scripts;环境变量如 COMPOSER_REQUIRE 仅对 update 生效,.env 文件不被 Composer 读取。

composer install 时怎么用环境变量代替 --no-scripts
不能用 COMPOSER_NO_SCRIPTS=1 替代 --no-scripts 参数——Composer 根本不识别这个环境变量,设了也无效。唯一可靠方式是显式加参数:composer install --no-scripts。
常见错误现象:在 CI 脚本里写 COMPOSER_NO_SCRIPTS=1 composer install,结果 post-install-cmd 依然执行,导致数据库迁移或缓存预热意外触发。
- 安全边界很窄:禁用脚本只控制“谁执行”,不控制“执行什么”;哪怕跳过 scripts,
autoload仍会生成,vendor/autoload.php仍可被后续 PHP 进程加载 - 若需批量控制多个参数(如同时禁脚本、禁插件、禁自动加载),必须全部显式写出:
composer install --no-scripts --no-plugins --no-autoloader - 离线场景下更要注意:
COMPOSER_DISABLE_NETWORK=1是硬性开关,但它和--no-scripts无关,两者必须共存才完整
怎么用环境变量临时覆盖 composer.json 里的变量插值
Composer 支持在 composer.json 的特定字段中使用 ${VAR_NAME} 语法,但仅限运行时展开,且不是所有字段都支持。
能用变量的字段包括:config.http-basic、repositories[].url、config.process-timeout;不能用的有:config.repos、config.github-protocols、autoload 等。
- 变量未定义时,Composer 默认静默忽略该字段,不会报错——容易导致私仓认证失败或镜像源未生效,却查不到原因
- Linux/macOS 下需用
export GIT_TOKEN=xxx提前导出,再运行composer install;Windows 命令行用set GIT_TOKEN=xxx,PowerShell 用$env:GIT_TOKEN="xxx" - 值含空格或特殊字符时,务必在
composer config --global设置时用英文双引号包裹,否则会被截断
COMPOSER_REQUIRE 环境变量怎么用于临时指定依赖版本
COMPOSER_REQUIRE 是 Composer v2.2+ 引入的合法环境变量,可用于替代 composer require 或临时覆盖 update 行为,适合 CI 场景。
它只在 composer update 过程中生效,格式是 JSON 字符串,例如:COMPOSER_REQUIRE='{"monolog/monolog":"^2.10"}' composer update。
- 该变量优先级高于
composer.json中的require,但低于命令行直接指定的包名约束(如composer update monolog/monolog:^3.0) - 不能用于
composer install;如果项目已 lock,COMPOSER_REQUIRE不会触发重算,必须配合--with-dependencies或先删composer.lock - JSON 必须是严格格式:键名用双引号,字符串值也要双引号,末尾不能有多余逗号,否则整个变量被忽略
为什么 .env 文件里的 APP_ENV 对 composer install 没用
Composer 本身不读取 .env 文件——它不是 Laravel 或 Symfony,没有内置的 dotenv 加载逻辑。你看到的 “APP_ENV 影响 install” 实际是项目自定义 scripts 触发的副作用。
比如 "post-install-cmd": ["@php artisan clear-compiled"],而 artisan 启动时由 vlucas/phpdotenv 加载了 .env,这才让 APP_ENV 生效。
- 直接运行
composer install不会加载任何.env变量,APP_ENV在 Composer 进程内始终为空 - 若想在 scripts 中用环境变量,只能靠 shell 层面提前导出:
APP_ENV=prod composer install - 全局配置(如
composer config --global)和.env完全无关;改.env不会影响COMPOSER_HOME或cache-dir等路径行为
环境变量在 Composer 里不是通用开关,而是高度受限的工具:有的根本不存在(如 COMPOSER_NO_SCRIPTS),有的只在特定上下文生效(如 COMPOSER_REQUIRE 仅对 update 有效),还有的需要严格匹配字段白名单(如 ${VAR} 插值)。最容易被忽略的是「静默忽略」行为——变量写错、路径不对、JSON 格式差一个引号,都不会报错,只会让配置失效。











