mediact/dependency-guard

此包已被弃用且不再维护。作者建议使用 maglnet/composer-require-checker 包代替。

静态生产依赖分析。

安装数: 42 107

依赖者: 0

建议者: 0

安全: 0

星标: 88

关注者: 7

分支: 6

开放问题: 4

类型:composer-plugin

1.1.2 2020-11-17 11:56 UTC

This package is auto-updated.

Last update: 2021-07-08 01:27:31 UTC


README

此包已被弃用,推荐使用 maglnet/composer-require-checker,该包维护良好且由 GrumPHP 本地支持。Composer require checker 功能更为丰富,保持更新,并且最重要的是,采用相同的 MIT 许可证

Packagist Packagist PHP from Packagist Scrutinizer Code Quality Code Coverage Build Status Build status Code Intelligence Status license

简介

MediaCT Dependency Guard 是一个静态代码分析器,用于确定您的包是否依赖于作为您的开发和/或测试环境副作用安装的代码。

安装

composer require --dev mediact/dependency-guard

该工具可以使用以下 3 种方式使用:

  1. 作为 composer 命令
  2. 作为独立命令
  3. 作为 GrumPHP 任务

Composer 命令

composer dependency-guard

独立使用

vendor/bin/dependency-guard

GrumPHP 任务

使用提供的 配置 运行 GrumPHP。

使用方法

运行 DependencyGuard 时,它将查找所有可以通过 composer.json 的 autoload 配置访问的文件。

它将遍历所有文件,尝试检测 PHP 文件,然后确定每个文件使用的符号(类、接口、特质)。

收集符号后,它将确定每个符号属于哪个包。如果一个包被检测到,它不是由于 require 部分,而是由于 composer.json 中的 require-dev 部分,则会记录一个违规。

此外,当确定一个包已安装,但没有代码使用该包时,也会记录另一个违规。

Violation text

在上面的例子中,包 mediact/data-container 作为开发包安装,但直接用于当前包的代码中。

另外,包 league/container 已安装,但没有任何代码直接使用。

要使用自定义的违规报告,支持 JSON 作为导出格式

Violation 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.jsonextra.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.jsonextra.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 是一个仅在开发安装中可用的符号。可能预计这个符号只在使用特定异常时才会自动加载,因此它不是“真正”的依赖。依赖保护器不会对当前符号进行此类特定检查。因此,这个异常被标记为依赖违规。

目前没有计划解决这个问题。尽管如此,欢迎对此问题的拉取请求和公开讨论。