GitHub Actions 中直接运行 composer install 会失败,因默认无 PHP 和 Composer;需用 shivammathur/setup-php@v2 安装指定 PHP 版本及扩展,并配置 platform、缓存 key(含 PHP 版本、lock 文件 hash、Composer 版本)和私有包认证。

GitHub Actions 里直接用 composer install 会失败?先确认 PHP 环境
GitHub Actions 默认不带 PHP,更不会预装 Composer。直接写 composer install 会报 Command not found: composer。必须显式安装 PHP 和 Composer。
推荐用官方维护的 shivammathur/setup-php Action,它能自动安装指定版本的 PHP + Composer + 扩展(比如 mbstring、xml),比手动 apt-get install 更可靠、版本可控。
- 在
.github/workflows/ci.yml中,先加一步 setup-php:uses: shivammathur/setup-php@v2 with: php-version: '8.2' extensions: mbstring, xml, curl, json
- 避免用
actions/setup-php(已归档停更),它不保证 Composer 可用 - 如果项目 require 了
ext-gd或ext-pdo_mysql,记得把它们加进extensions列表,否则composer install会因扩展缺失而退出
composer install 报 “Your requirements could not be resolved”?检查 lock 文件和平台配置
CI 中常见错误是本地有 composer.lock,但 GitHub Actions 运行时 PHP 版本或扩展与本地不一致,导致依赖解析失败。Composer 会按 platform 配置模拟目标环境 —— 但默认不启用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 确保项目根目录存在
composer.lock,且已提交到 Git;没有 lock 文件时,CI 会按composer.json重新解析,结果不可控 - 在
composer.json的config段声明目标平台,例如:"config": { "platform": { "php": "8.2.10" } }这样即使 CI 用的是 8.2.12,Composer 也会按 8.2.10 解析依赖 - 如果项目用了
phpstan或psalm等 dev 依赖,而 CI 只跑测试不跑静态分析,可加--no-dev节省时间,但要确认测试代码没依赖这些工具的类
缓存 Composer vendor 目录能省 60%+ 时间,但要注意路径和 key 冲突
反复下载包太慢,用 actions/cache 缓存 vendor/ 是标准做法。但缓存 key 设计不对,会导致“缓存命中却出错”——比如 PHP 版本变了但缓存没失效。
- key 必须包含:PHP 版本、Composer lock 文件 hash、Composer 自身版本(
composer --version输出):key: ${{ runner.os }}-php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.lock') }}-${{ hashFiles('**/composer.phar') }} - 不要只用
hashFiles('composer.lock'),因为 lock 文件内容不变但 PHP 版本升级时,vendor 内实际安装的包可能不同(如某些包的platform-check逻辑会跳过) - 缓存路径写
vendor/(末尾带斜杠),不是./vendor;路径错误会导致缓存写入失败但不报错 - 首次运行没缓存时,
composer install仍会执行,所以命令别放在 cache action 的 if 条件里
私有包(GitLab / private Packagist)认证失败?别硬塞 token 到 composer.json
用 auth.json 配置私有仓库时,绝不能把 token 提交到代码库。GitHub Actions 提供 secrets 注入机制,配合 composer config 动态写入最安全。
- 在 workflow 中,用
composer config命令临时写入 auth:composer config http-basic.your-private-repo.com ${{ secrets.PRIVATE_REPO_USER }} ${{ secrets.PRIVATE_REPO_TOKEN }} - 如果是 Git over SSH 私有包,需提前配置
ssh-key并用webfactory/ssh-agentAction 加载,再确保composer.json中 repo type 是vcs且 URL 是git@your-git-server:vendor/pkg.git - 注意:某些私有 Packagist 服务要求在
auth.json中使用token字段而非http-basic,此时应改用:composer config --auth github-oauth.github.com ${{ secrets.GITHUB_TOKEN }}
最常被忽略的是 platform 配置和缓存 key 的组合维度 —— PHP 小版本更新、Composer 自身 patch 升级、甚至 lock 文件里某行空白符变化,都可能让缓存失效或误命中。宁可多算几个 hash,别省那几秒 CI 时间。

















