根本原因是php版本、扩展或依赖约束不匹配;需在workflow中显式指定精确php版本,配置platform.php与之完全一致,启用所需扩展,并通过secrets注入.env变量,用env块全局传递,确保autoload路径正确且测试分组可控。

GitHub Actions 中 composer install 报错“Your requirements could not be resolved”
根本原因通常是 PHP 版本、扩展或依赖约束不匹配,而不是网络或权限问题。Actions 默认用 Ubuntu runner,PHP 版本可能低于 composer.json 里 config.platform.php 或 require.php 指定的版本。
- 在
.github/workflows/test.yml中显式指定 PHP 版本,例如用php-version: '8.2'(别只写'8') - 检查
composer.json是否设置了"config": {"platform": {"php": "8.2.0"}},若设了就必须和 Actions 中版本完全一致,否则 Composer 会模拟该平台解析依赖,导致冲突 - 运行
composer install --no-interaction --prefer-dist --optimize-autoloader,避免交互提示和 dev 依赖干扰 CI 环境 - 如果项目用了
ext-redis或ext-gd等扩展,需在 workflow 中用ext-gd: true显式启用(GitHub 官方setup-phpaction 支持)
如何让 GitHub Actions 正确加载 .env 文件用于测试
.env 不该进仓库,但测试又常依赖配置值(如数据库 URL)。直接 cp .env.example .env 不可靠——example 里往往是占位符,不是可运行值。
- 用 GitHub Secrets 存敏感值,例如
DB_URL,然后在 workflow 中注入:DB_URL: ${{ secrets.DB_URL }} - 在
steps中用run: echo "DB_URL=${{ secrets.DB_URL }}" >> .env动态生成(注意引号和换行,避免覆盖其他变量) - 不要在
composer test命令前用source .env—— Actions 的每个run是独立 shell,环境变量不会透传;改用env:块全局注入,或让测试框架(如 PHPUnit)从.env文件读取 - 验证是否生效:加一步
run: cat .env(仅调试时),确认内容正确且无空行/乱码
PHPUnit 测试失败但本地能过,常见于 autoload 或路径差异
Composer 的 autoloader 在 CI 中生成路径和本地不同,尤其当 psr-4 映射含大小写错误,或测试文件放在非标准目录时。
- 确保
composer.json中"autoload-dev"正确声明测试类路径,例如:"autoload-dev": {"psr-4": {"Tests\": "tests/"}},且tests/下有Tests/命名空间子目录 - 运行
composer dump-autoload --optimize --classmap-authoritative再测试,强制刷新映射,排除缓存干扰 - GitHub Actions 默认工作目录是仓库根,但某些自定义脚本可能 cd 错了;在
run步骤开头加pwd && ls -la确认当前路径 - PHPUnit 配置里
bootstrap路径写相对路径(如vendor/autoload.php)比绝对路径更安全
跳过某些测试或条件执行,避免 CI 失败但又不想删代码
不是所有测试都适合跑在 CI:比如集成测试依赖外部 API,或慢速测试拖长构建时间。硬删或注释会丢失验证能力,应通过配置控制。
- 用 PHPUnit 的
--testsuite分组,例如在phpunit.xml中定义<testsuite name="unit"></testsuite>,CI 只跑vendor/bin/phpunit --testsuite unit - 用环境变量开关:在测试代码中
if (getenv('SKIP_INTEGRATION') === '1') $this->markTestSkipped('CI mode');,CI workflow 中设Skip_INTEGRATION: 1 - GitHub Actions 支持
if: github.event_name == 'pull_request'控制步骤执行时机,但别滥用——逻辑判断尽量下沉到脚本内,保持 workflow 干净 - 慎用
@group注解跳过,因为 IDE 和本地命令容易漏掉分组参数,导致行为不一致
php -v、php -m、composer show 输出,比猜更快。










