GitHub Workflow矩阵按PHP版本条件安装PHPUnit异常问题
配置存在的核心错误
if条件语法完全错误
GitHub Actions的if字段默认直接解析表达式,不需要额外用${{ }}包裹。你加上包裹后,整个表达式会被先做字符串插值,最终if拿到的是类似"7.0 == 7.0"的普通字符串——非空字符串在GitHub Actions的判定逻辑里恒为真,这就是你遇到所有分支全执行的原因;如果插值过程出现解析异常,所有条件都会被判定为假,就会出现全不执行的情况。- PHPUnit安装逻辑冲突
你在shivammathur/setup-php步骤里已经配置了tools: phpunit:${{ matrix.phpunit-versions }},这个配置会在系统全局安装指定版本的PHPUnit,后面又通过composer安装项目内的PHPUnit,很容易出现版本冲突,导致依赖解析失败。 - 版本比较存在类型隐患
matrix中定义的php-versions值都是字符串类型,你直接拿字符串和数字字面量(比如>= 8.0)做比较,不同runner版本下的隐式类型转换规则不一致,很容易出现判断失效的问题。
你对GitHub Workflow的认知偏差
- 混淆了表达式插值的适用场景:
${{ }}语法仅用于普通配置字段的字符串占位,if本身是原生表达式上下文,不需要套插值符号,套了反而会把表达式转成普通字符串,完全失去判断能力。 - 误解了setup-php的tools参数逻辑:该参数安装的是系统全局工具,不会写入项目composer依赖,如果你要使用
vendor/bin下的项目内PHPUnit,就不需要在tools里配置全局PHPUnit,避免版本不一致。 - 忽略了matrix值的类型规则:matrix里定义的所有配置值默认都是字符串,做相等、大小比较时,要和字符串字面量对比,不要混用数字字面量,避免隐式转换bug。
修正方案
最稳妥的方式是直接把PHPUnit版本映射写到matrix配置里,完全不需要写冗余的if判断,配置更简洁也不容易出错:
name: PHP CI on: pull_request: branches: - "master" workflow_dispatch: jobs: render-php: runs-on: ${{ matrix.operating-system }} strategy: fail-fast: false matrix: operating-system: ["ubuntu-latest"] php-versions: ["7.0", "7.4", "8.0"] include: - php-versions: "7.0" phpunit-version: "^6.0" - php-versions: "7.4" phpunit-version: "^8.0" - php-versions: "8.0" phpunit-version: "^9.0" steps: - uses: actions/checkout@v3 with: fetch-depth: 0 - run: git merge origin/master --no-commit --ff-only - uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} extensions: mbstring, intl ini-values: post_max_size=256M, max_execution_time=180 coverage: xdebug - name: Install matched PHPUnit run: composer require --dev --with-all-dependencies --no-update phpunit/phpunit:${{ matrix.phpunit-version }} - run: composer install - run: ./vendor/bin/phpunit
如果你一定要保留if判断的写法,要去掉${{ }}包裹,所有比较值用单引号标注为字符串,示例:
- name: "PHP 7.0" if: matrix.php-versions == '7.0' run: composer require --dev --with-all-dependencies --no-install phpunit/phpunit 6.0 - name: "PHP 7.4" if: matrix.php-versions == '7.4' run: composer require --dev --with-all-dependencies --no-install phpunit/phpunit 8.0 - name: "PHP >=8.0" if: matrix.php-versions >= '8.0' run: composer require --dev --with-all-dependencies --no-install phpunit/phpunit
补充说明:PHPUnit 6.0仅支持PHP 7.0-7.1,PHPUnit 8.0支持PHP 7.2-7.4,PHPUnit 9.0+支持PHP 7.3+、8.0+,你预设的PHP版本和PHPUnit版本对应关系是正确的。
内容的提问来源于stack exchange,提问作者Alex Ahlgreen Westergaard
相关产品推荐
相关产品推荐

