shipmonk/name-collision-detector

一个简单的工具,用于在您的项目中查找模糊的类或其他名称重复项。

2.1.1 2024-03-01 13:26 UTC

This package is auto-updated.

Last update: 2024-09-02 11:13:16 UTC


README

一个简单的工具,允许您检测同一命名空间内是否有重复定义的类型。这意味着任何模糊的类、接口、枚举、特性、常量或函数都会被报告。当发现任何重复时,会返回非零退出码。

安装

composer require --dev shipmonk/name-collision-detector

使用

检查重复类型

vendor/bin/detect-collisions dir1 dir2 dir3 # relative to cwd

示例错误输出

Foo\NamespacedClass2 is defined 2 times:
 > /tests/sample-collisions/file2.php:23
 > /tests/sample-collisions/file2.php:45

GlobalInterface1 is defined 2 times:
 > /tests/sample-collisions/file1.php:8
 > /tests/sample-collisions/file2.php:11

示例成功输出

OK (no name collision found)
 * analysed files: 9867
 * excluded files: 0
 * elapsed time: 1.057 s
  • 注意性能: 10,000 个文件只需几秒钟

配置

如果当前工作目录中存在名为 collision-detector.json 的文件,则其内容作为配置选项。可能的配置选项

{
    "scanPaths": ["src", "tests"], // files/directories to scan, relative to config file directory, glob not supported
    "excludePaths": ["tests/collisions"], // files/directories to exclude, relative to config file directory, glob not supported
    "fileExtensions": ["php"], // file extensions to parse
    "ignoreParseFailures": false // skip files with parse errors or not
}

通过 CLI 参数提供的路径优先于 scanDirs 中的路径。

您可以通过 vendor/bin/detect-collisions --configuration path/to/config.json 提供自定义配置文件路径

原因

在项目中存在冲突的类可能会在调试过程中导致极大的困扰。通常,您有 PSR-4 自动加载,这通常可以为您解决此问题,但在某些情况下(例如 PHPStan 规则测试文件),您需要编写任何代码(使用 classmap 自动加载)。在这种情况下,测试可能在独立运行时正常工作,但在运行所有测试时失败(取决于哪个类首先被自动加载)。因此,在 CI 中拥有冲突检测器可能很有用。

Composer 的模糊类解析

您可能认为 Composer 本身正在以某种方式解决这个问题,但这并不是真的。Composer 执行的唯一类似检查(导致 Warning: Ambiguous class resolution)发生在类在 vendor 路径内冲突时,而不是在您的代码库中。Composer 不会报告您的项目中的类歧义。

支持的 PHP 版本

  • PHP 7.2 - PHP 8.3