如何让 Composer 识别并使用环境变量?

13次阅读

composer不直接解析.env文件,仅支持引用已导出的系统环境变量;需在OS中export(linux/macos)或set/setx(windows),并在composer.json中用${VAR_NAME}语法调用,如”url”: “https://${gitHUB_TOKEN}@github.com/user/repo.git”。

如何让 Composer 识别并使用环境变量?

Composer 本身不直接读取或解析环境变量(比如 .env 文件里的值),但它支持在 composer.json 中通过 ${VAR_NAME} 语法引用系统级环境变量——前提是这些变量已在操作系统中真正设置并导出。

确保环境变量已正确设置并导出

Composer 只能访问 shell 中“已导出”的环境变量。例如,在 Linux/macOS 中:

  • ✅ 正确(导出后生效):export MY_PACKAGE_VERSION="1.2.3"
  • ❌ 无效(未导出,仅当前 shell 变量):MY_PACKAGE_VERSION="1.2.3"

Windows 命令行需用 set(临时)或系统属性(永久),PowerShell 用 $env:MY_PACKAGE_VERSION="1.2.3",但注意 Composer 在 Windows 上通常由 Git bash 或 CMD 调用,推荐统一用 CMD 的 setx 或在 CI/CD 中明确注入。

composer.json 中使用 ${VAR_NAME} 占位符

你可以在 composer.json 的多个字段中使用环境变量插值,例如:

  • 仓库地址"url": "https://${GITHUB_TOKEN}@github.com/user/repo.git"
  • 包版本约束"my/private-package": "${PRIVATE_PKG_VERSION}"(需配合 repositories 定义)
  • 脚本参数"scripts": {"deploy": "php deploy.php --env=${app_ENV}"}

⚠️ 注意:该插值只在 composer install / update 运行时解析,不会写入 composer.lock;且变量必须存在,否则会报错(如 undefined variable: FOO)。

配合 dotenv 工具(需额外处理)

Composer 不原生加载 .env 文件,但你可以用 vlucas/phpdotenv 在自定义脚本中预加载。更实用的做法是:在 CI/CD 或部署脚本中,先用 set -a; source .env; set +a(Linux)或等效方式把 .env 导入环境,再运行 composer install

例如 GitHub Actions 中:

- name: Load env   run: |     set -a     source .env     set +a - name: Install dependencies   run: composer install --no-interaction

调试与验证技巧

快速确认 Composer 是否读到了变量:

  • 临时在 composer.json 中加一个假依赖:"debug/env-test": "${MISSING_VAR}-test",然后运行 composer update 看是否报错
  • echo $MY_VAR(Linux/macOS)或 echo %MY_VAR%(Windows CMD)确认变量已设
  • 执行 composer config --list | grep -i env 查看是否有相关配置(Composer 自身配置项不含环境变量逻辑,仅作排除)

基本上就这些。不复杂但容易忽略导出这一步。

text=ZqhQzanResources