infection 是独立 cli 工具,非 composer 插件;能否运行取决于 php ≥8.0、pcntl 扩展可用、infection.json5 中 source.directories 和 phpunit.configdir 路径精准——路径均相对于当前工作目录,而非项目根。

Infection 不是 Composer 插件,它只是借 Composer 安装和调用的独立 CLI 工具;真正决定它能不能跑起来的,是 PHP 版本、pcntl 扩展可用性、infection.json5 中 source 和 phpUnit.configDir 的路径是否精准——装上 composer require --dev infection/infection 远不等于能用。
为什么 ./vendor/bin/infection 没输出、卡住或秒退
这不是失败,是 Infection 默认静默 fork 子进程执行变异,不打印日志、不显示进度条。新手常误判为“没反应”。
- 加
--log-verbosity=debug才能看到真实错误,比如Failed to create process就是 Windows 下 pcntl 扩展不可用的明确信号 - Linux/macOS 要确认当前用户对
vendor/和临时目录(如/tmp/infection)有写权限,否则 fork 失败也不报错 - 最快验证方式:用
--filter=MyServiceTest限定单个测试类,5 秒内出结果就说明流程通了 - 别在 CI 里用
--dry-run,它会导致类未加载,后续直接报Class not found
infection.json5 中必须手动配准 phpunit.xml 路径
Infection 根本不会自动扫描项目找 phpunit.xml。填错 configDir,就会报 Could not find PHPUnit configuration file 然后静默跳过所有测试。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"phpUnit": { "configDir": "." }中的.必须指向phpunit.xml(或phpunit.xml.dist)实际所在目录,不是项目根目录,也不是tests/—— 如果文件在tests/phpunit.xml,这里就得写"configDir": "tests" - 先手动运行
phpunit --configuration tests/phpunit.xml --list-tests验证路径有效,再填进配置 - CI 环境(如 GitHub Actions)中,
configDir路径要跟 runner 工作目录对齐,Ubuntu runner 默认工作目录是/home/runner/work/repo/repo,所以"configDir": "tests"是常见正确值
PHP 版本与 pcntl/posix 扩展是硬门槛
低于 PHP 8.0 或缺扩展,composer require --dev infection/infection 可能成功,但运行必挂。
- 检查版本:
php -v,低于 8.0 就别试;降级到 Infection 0.26 是下策,功能和报告差异大 - 检查扩展:
php -m | grep -E "pcntl|posix",Mac M1/M2 用户常因 Homebrew PHP 缺失pcntl卡住 - Windows 原生不支持
pcntl,得用 WSL 或 Docker;GitHub Actions 必须用runs-on: ubuntu-latest,并在步骤开头加run: export PCNTL_ENABLED=1 - 全局安装(
composer global require infection/infection)会污染环境、版本难隔离,不推荐
source.directories 配置错误会导致全盘扫描或超时
漏掉 "source": { "directories": ["src"] },Infection 会默认扫描整个项目目录,包括 vendor/ 和 tests/,大幅拖慢速度甚至 OOM。
-
"source": { "directories": ["src"] }必须显式指定,不能依赖默认行为 -
"timeout": 30建议设为 20–40:太小(如 10)易在 CI 上被 kill,太大则掩盖低效变异逻辑 - 别信文档里“自动识别测试框架”的说法——Infection 不猜、不推、不妥协,路径错一点,就全白搭
最常被忽略的是 configDir 和 source.directories 的路径语义:它们不是“相对项目根”,而是“相对于当前工作目录”,而这个目录在本地开发和 CI 中可能完全不同。一个配置,两套路径,是线上跑不通的头号原因。










