直接写composer install必定失败,因ubuntu runner默认未安装php和composer命令,错误现象如“command not found”等是环境缺失信号;必须用shivammathur/setup-php@v2安装php及必要扩展,再配合php-actions/composer@v6注入指定版本composer,并确保工作目录正确、缓存策略合理、参数含--no-interaction --prefer-dist --optimize-autoloader --no-dev。

为什么直接写 composer install 必定失败
因为 Ubuntu runner 默认既没装 PHP,也没装 composer 命令——不是配置错,是根本不存在。你写 run: composer install 就像对空房间喊“开机”,没人应。
常见错误现象包括:Command not found、Your requirements could not be resolved、卡在 Loading composer repositories 无响应。这些都不是网络或依赖问题,而是环境缺失的明确信号。
- 必须用
shivammathur/setup-php@v2显式安装 PHP + 扩展(mbstring、xml、zip、pdo、curl至少全开) - 别用
sudo apt install composer:Ubuntu 源里常是过时的 2.0.x,且不保证启用ext-zip - 别手写
curl -sS https://getcomposer.org/installer | php:绕过缓存、无版本控制、易因 TLS 中断
setup-php 和 php-actions/composer 怎么配才不翻车
推荐组合:先用 shivammathur/setup-php@v2 装 PHP 和扩展,再用 php-actions/composer@v6 注入对应版本的 composer 二进制到 PATH。它会自动校验 composer.json 格式,支持锁死版本(如 composer-version: '2.5.8')。
关键参数不能省:
-
php-version: '8.2'—— 必须和composer.json的config.platform.php对齐 -
extensions: ['mbstring', 'xml', 'zip', 'pdo', 'curl']—— Laravel/Symfony 硬依赖,缺一个就停在解析阶段 -
with: composer-version: '2.5.8'—— 如果项目要求特定 Composer 版本,显式声明
缓存策略和参数怎么选才稳定
缓存 vendor/ 是陷阱:PHP 小版本升级、扩展开关变化、Composer 版本更新都会导致二进制不兼容。真正该缓存的是 ~/.composer/cache,key 必须含 composer.lock 哈希和 PHP 版本。
执行 composer install 时,以下参数是底线:
-
--no-interaction—— 避免交互式提示阻塞 CI -
--prefer-dist—— 下载压缩包而非 Git 克隆,提速且稳定 -
--optimize-autoloader—— 生产环境必需 -
--no-dev—— CI 构建通常不需要phpunit等开发依赖
如果 composer.json 有 platform.php 声明(如 "php": "8.2.10"),CI 环境 PHP 是 8.2.12 也照常解析;但若没声明,又没加 --ignore-platform-req=ext-*,就容易卡在扩展校验。
工作目录和文件检出最容易被忽略
actions/checkout@v4 后,当前工作目录仍是 runner 的根路径,composer.json 并不在当前目录下。后续所有命令都在空目录执行,自然找不到文件。
必须做且只做其一:
- 在每个
run步骤前加cd ${{ github.workspace }} - 或统一给所有步骤加
working-directory: ${{ github.workspace }}
验证是否生效:在 composer install 前加一步 ls -la,确保日志里能看到 composer.json 和 composer.lock。没有它们,composer install 就是盲跑。
最后提醒一句:CI 里的 composer install 不是本地命令的平移,它是多层环境、缓存、权限、路径共同作用的结果——漏掉任一环,轻则超时失败,重则构建产物不可用。











