Composer install时环境变量不生效,因Composer不解析${VAR}占位符且不读取.env文件;正确做法是变量须在启动前注入shell环境,如Linux用MY_TOKEN=abc123 composer install,CI中须通过平台env块显式注入。

Composer install 时环境变量不生效?检查变量作用域和加载时机
Composer 本身不解析 ${VAR} 占位符,也不自动读取 .env 文件。你在 composer.json 里写的 "${GITHUB_TOKEN}" 或 "${DB_PASSWORD}" 会被当作文本字面量传给下游命令,根本不会展开。
常见错误现象包括:
-
composer install报错 “Could not fetch package”,但手动curl -H "Authorization: Bearer ${GITHUB_TOKEN}"却能通——说明变量没传进 Composer 进程 - CI 日志里看到完整命令如
composer require vendor/private-package,但没看到密钥,误以为安全——其实变量根本没生效,安装直接失败
正确做法是让变量在 Composer 启动前就存在于 shell 环境中:
- Linux/macOS:用
MY_TOKEN=abc123 composer install(注意等号前后无空格) - Windows PowerShell:用
$env:MY_TOKEN="abc123"; composer install - CI/CD 中必须通过平台机制注入,例如 GitHub Actions 的
env:块,GitLab CI 的variables:,且确保该变量被显式传递给 job 步骤
私有仓库认证别碰 auth.json 明文文件
把 auth.json 提交到 Git 是最常踩的坑。哪怕加了 .gitignore,只要文件曾被提交过,历史记录里就永远留着密钥。
更安全的路径是运行时动态生成:
- CI 脚本中用
echo '{"http-basic": {"repo.example.com": {"username": "user", "password": "'"$CI_REPO_PASSWORD"'"} }' > auth.json - 或者用
composer config命令写入:composer config http-basic.repo.example.com user "$CI_REPO_PASSWORD" - 如果使用 SSH 克隆私有包,优先配部署密钥而非 HTTP token——
git@地址天然绕过auth.json和环境变量管理
注意:composer config 写入的是当前项目的 auth.json,不是全局配置;若要避免生成文件,可配合 --no-interaction + 环境变量预设,但前提是 Composer 版本 ≥ 2.5 且底层 Git 支持凭据助手。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
Composer 脚本中读敏感信息,必须走 PHP 方法调用
别在 "scripts" 里写 "post-install-cmd": "curl -H 'Authorization: Bearer $API_KEY' ..."。这种写法会让密钥出现在进程列表、shell 历史、CI 日志里,且存在 shell 注入风险。
唯一可控的方式是把逻辑封装进 PHP 类方法:
- 在
composer.json中定义:"deploy": "App\Script::runDeploy" - 在
AppScript::runDeploy()中用getenv('API_KEY')或$_ENV['API_KEY']读取 - 确保 PHP 配置中
variables_order包含"E"(即启用$_ENV),否则getenv()可能返回 false - 脚本开头强制校验:
if (!getenv('API_KEY')) { throw new RuntimeException('Missing API_KEY'); }
这个模式下,密钥只存在于 PHP 进程内存中,不会拼接到 shell 命令,也不会被 composer dump-autoload -v 回显。
Docker Compose + Composer 构建时,别用 build-arg 传密钥
build-arg 是构建阶段最危险的变量传递方式:它会固化进镜像每一层,执行 docker history --no-trunc your-image 就能看到明文密钥。
替代方案只有两个:
- 启用 BuildKit 后用
--secret:在Dockerfile中写RUN --mount=type=secret,id=mykey cat /run/secrets/mykey > /tmp/key,再在 Composer 安装脚本里读取该文件 - 把需要密钥的操作移到容器启动时(runtime),而不是构建时(build-time)——比如用
entrypoint.sh在composer install前注入变量,或用bref/secrets-loader从 AWS SSM 动态拉取
如果你正在用 docker-compose.yml 编排 Laravel 开发环境,记得把 MYSQL_PASSWORD 这类变量全挪到 .env 文件,并在 environment: 字段里用 ${DB_PASSWORD} 引用——但必须确认宿主机已加载该 .env,否则 Docker Compose 启动时变量为空,MySQL 容器会因密码缺失启动失败。

















