mediact / dependency-guard
Requires
- php: ^7.1
- composer-plugin-api: ^1.1 | ^2.0
- ext-json: *
- ext-spl: ^7.1
- composer/composer: ^1.6
- nikic/php-parser: ^3.0 | ^4.0
- roave/better-reflection: ^2.0 | ^3.1
- symfony/options-resolver: ^4.1
Requires (Dev)
- kint-php/kint: @stable
- mediact/testing-suite: @stable
- mikey179/vfsstream: ^1.6
- phpro/grumphp: ~0.1
- symfony/process: @stable
Suggests
- phpro/grumphp: To run DependencyGuard as GrumPHP Task.
README
此包已被弃用,推荐使用 maglnet/composer-require-checker
,该包维护良好且由 GrumPHP 本地支持。Composer require checker 功能更为丰富,保持更新,并且最重要的是,采用相同的 MIT 许可证。
简介
MediaCT Dependency Guard 是一个静态代码分析器,用于确定您的包是否依赖于作为您的开发和/或测试环境副作用安装的代码。
安装
composer require --dev mediact/dependency-guard
该工具可以使用以下 3 种方式使用:
- 作为 composer 命令
- 作为独立命令
- 作为 GrumPHP 任务
Composer 命令
composer dependency-guard
独立使用
vendor/bin/dependency-guard
GrumPHP 任务
使用提供的 配置 运行 GrumPHP。
使用方法
运行 DependencyGuard 时,它将查找所有可以通过 composer.json
的 autoload 配置访问的文件。
它将遍历所有文件,尝试检测 PHP 文件,然后确定每个文件使用的符号(类、接口、特质)。
收集符号后,它将确定每个符号属于哪个包。如果一个包被检测到,它不是由于 require
部分,而是由于 composer.json
中的 require-dev
部分,则会记录一个违规。
此外,当确定一个包已安装,但没有代码使用该包时,也会记录另一个违规。
在上面的例子中,包 mediact/data-container
作为开发包安装,但直接用于当前包的代码中。
另外,包 league/container
已安装,但没有任何代码直接使用。
要使用自定义的违规报告,支持 JSON 作为导出格式
配置异常
有时依赖违规是故意发生的。
建议
例如,当某个包为多个特定工厂的实现提供工厂时,每个工厂需要不同的包。在这种情况下,该包需要将这些实现作为开发包,并在它们的 composer.json
中的 suggest
部分列出。
当一个包被添加到 suggest
部分时,其违规行为会被依赖保护器忽略
{ "require": { "psr/http-message-implementation": "@stable" }, "require-dev": { "guzzlehttp/psr7": "^1.4" }, "suggest": { "guzzlehttp/psr7": "To use the Guzzle PSR7 implementation." } }
排除符号
要排除特定符号,请将以下内容添加到 composer.json
的 extra.dependency-guard.exclude
部分
{ "extra": { "dependency-guard": { "exclude": [ "Specific\\Class\\To\\Exclude", "Specific\\Namespace\\", "Some\\Class\\Matching\\Foo*" ] } } }
可以使用精确匹配、命名空间匹配或使用 fnmatch 的模式来排除符号。
上面的配置将排除以下内容
Specific\Class\To\Exclude
Specific\Namespace\Bunny
Some\Class\Matching\FooBarBaz
忽略包
要忽略特定包的违规消息,请将以下内容添加到 composer.json
的 extra.dependency-guard.ignore
部分
{ "extra": { "dependency-guard": { "ignore": [ "acme/tnt", "symfony/", "league/fly*" ] } } }
可以使用精确匹配、供应商匹配或使用 fnmatch 的模式来忽略包。
上面的配置将忽略以下包的违规
acme/tnt
symfony/console
league/flysystem
已知限制
在当前形式下,一些场景无法被依赖保护器覆盖。以下列出已知限制
🦊 与集成测试结合的 Pokémon 异常处理
Pókemon 异常处理也被称为
这种方法会捕获任何异常,并将其转发或忽略
<?php try { doSomething(); } catch (Throwable $exception) { // Do nothing. }
当这种方法用于处理应用程序中的异常时,在执行集成测试时会导致以下问题。
当测试设置期望/断言时,断言可能会失败。当断言失败时,它会抛出相应的异常,这些异常原本应该被测试框架捕获。
然而,它会被上面的异常处理捕获。为了解决这个问题,以下代码最终出现在生产代码中
<?php try { doSomething(); } catch (\PHPUnit\Framework\AssertionFailedError $assertionException) { // Re-throw the exception, as it is part of the testing framework. throw $assertionException; } catch (Throwable $exception) { // Do nothing. }
上面的代码导致依赖保护器检测到 \PHPUnit\Framework\AssertionFailedError
是一个仅在开发安装中可用的符号。可能预计这个符号只在使用特定异常时才会自动加载,因此它不是“真正”的依赖。依赖保护器不会对当前符号进行此类特定检查。因此,这个异常被标记为依赖违规。
目前没有计划解决这个问题。尽管如此,欢迎对此问题的拉取请求和公开讨论。