composer安装卡在downloading主因是未生效镜像源,需用--repository-url显式指定清华或华为云镜像;phpunit版本必须匹配php版本,如php 8.1用^10.5,并验证phpunit.xml位置与bootstrap配置。

直接用中文镜像装 PHPUnit 不会变快,真正卡住的是 composer install 阶段——镜像只加速依赖下载,不加速测试执行。关键在「装得稳、装得准、装得干净」。
为什么 CI 里 composer install 总卡在 Downloading?
默认走 packagist.org,DNS 解析慢、TLS 握手不稳定、CDN 节点少,尤其在 GitHub Actions 或 GitLab CI 这类无缓存的干净容器里,GET https://packagist.org/packages.json 失败是常态。这不是 PHPUnit 的问题,是源站不可达。
-
composer.lock锁的是元数据 URL,不是下载地址;镜像没生效,所有包仍回源 - 全局配置
composer config -g在 CI 容器里基本无效——每次构建都是新用户、新 HOME - 必须用
--repository-url=https://mirrors.tuna.tsinghua.edu.cn/composer/显式指定,优先级最高,100% 走镜像 - 别用已废弃的
--repository(少 -url),Composer 2.9.6+ 会直接报错
composer require --dev phpunit/phpunit 必须带版本号
不锁版本,Composer 可能拉到与当前 PHP 不兼容的主版本。比如 PHP 8.1 项目装了 ^11.0,立刻报 Declaration of PHPUnitFrameworkTestCase::setUp(): void must be compatible。
- PHP 7.4 / 8.0 →
composer require --dev phpunit/phpunit:^9.6 - PHP 8.1(含 Laravel 10)→
composer require --dev phpunit/phpunit:^10.5 - PHP 8.2+ 且无框架强约束 → 可试
^11.0,但确认没用phpunit-skelgen(v11 已移除) - 装完立刻验证:
./vendor/bin/phpunit --version,输出版本号必须和你指定的一致
phpunit.xml 放错位置或写错路径,就等于没配
PHPUnit 默认只识别项目根目录下的 phpunit.xml 或 phpunit.xml.dist。文件名多空格、放错目录、路径写成 ./tests 而不是 tests,它就静默退回到默认扫描逻辑——只找当前目录下 *Test.php,完全忽略你的配置。
-
<directory></directory>值应为tests(相对配置文件所在目录,即项目根目录) -
bootstrap="vendor/autoload.php"这行不能删,否则use App\Test\SomeClass也会报错 - IDE(如 PHPStorm)默认加
--no-configuration参数,需手动关掉 - 覆盖率配置必须用
<coverage><include><directory>src</directory></include></coverage>,旧版<whitelist></whitelist>在 PHPUnit ≥9.3 已失效
镜像只参与安装,不参与运行——测试阶段必须断网验证
CI 脚本里最常漏的一步:安装完依赖后,没验证 vendor/ 是否完整、autoload-dev 是否生效。镜像本身没问题,问题出在「什么时候用」和「用完是否清理上下文」。
- CI 流水线应按顺序执行:
composer config -g repos.packagist composer https://mirrors.huaweicloud.com/composer/→composer install --no-dev --optimize-autoloader --repository-url=...→vendor/bin/phpunit - 禁止在
phpunit.xml或 bootstrap 文件中调用Composer\Autoload\ClassLoader::register()以外的 Composer 运行时逻辑 - 若需动态加载 stub 类,用
require_once显式引入,不要依赖 Composer 自动发现——避免因镜像导致 autoloader 生成差异 - 最易被忽略的是
composer.lock中platform字段:不同 PHP 版本下生成的 lock 文件可能不兼容,CI 应始终用目标环境版本生成 lock
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











