maglnet/composer-require-checker

命令行工具,用于分析composer依赖项并验证包的源代码中未使用任何未知符号

4.12.0 2024-09-02 13:14 UTC

README

A CLI tool to analyze composer dependencies and verify that no unknown symbols are used in the sources of a package. This will prevent you from using "soft" dependencies that are not defined within your composer.json require section.

current version

这是什么?

"软"(或传递性)依赖是指您没有明确定义其存在但仍然使用的代码。相对的是“硬”(或直接)依赖。

您的代码肯定使用了外部依赖项。想象一下,您找到了一个库来访问远程API。您需要thatvendor/api-lib来构建您的软件并在代码中使用它。这个库是一个硬依赖。

然后您看到另一个远程API可用,但没有库。用例很简单,所以您四处寻找,发现guzzlehttp/guzzle(或任何其他HTTP客户端库)已经安装,并立即使用它来获取一些信息。Guzzle现在成为了一个软依赖。

然后有一天,当您更新依赖项时,您对第二个API的访问中断了。为什么?事实证明,安装guzzlehttp/guzzle的原因是它是您包含的thatvendor/api-lib的依赖项,并且它们的开发人员决定从早期的主要版本更新到最新版本,并在他们的变更日志中简单地声明:“版本3.1.0使用最新的主要版本Guzzle - 预计不会出现破坏性更改。”

您可能会想:我的代码怎么办?

ComposerRequireChecker解析您的代码和您的composer.json文件,以查看您的代码是否使用了未声明为所需库的符号,即软依赖。如果您依赖于已经安装但未明确请求的组件,此工具将对此提出异议,并且您应该明确要求它们,使它们成为硬依赖。这将防止意外的更新。

在上面的情况下,您不会收到thatvendor/api-lib的最新更新,但如果在更新之前您也要求guzzlehttp/guzzle,则您的代码将继续工作。

该工具还将检查是否使用了只有安装了扩展才能使用的PHP函数,并且如果未明确要求该扩展,则会提出异议。

安装/使用

ComposerRequireChecker不应该作为您项目依赖项的一部分安装。

PHAR文件(首选)

请检查发行版以获取可用的PHAR文件。下载最新版本并按如下方式运行

php composer-require-checker.phar check /path/to/your/project/composer.json

PHIVE

如果您已经使用PHIVE来安装和管理项目工具,那么您应该能够像这样简单地安装ComposerRequireChecker

phive install composer-require-checker

Composer - 全局命令

此包可以通过使用Composer轻松全局安装

composer global require maglnet/composer-require-checker

如果您尚未设置Composer安装以支持全局要求,请参阅Composer CLI - global 如果已经完成,请按如下方式运行

composer-require-checker check composer.json

这里的composer.json指的是您项目的根Composer清单。

关于Xdebug的说明

如果在运行ComposerRequireChecker时,您的PHP包含了Xdebug,您可能会遇到一些额外问题,例如超过与Xdebug相关的最大嵌套级别,而且更重要的是,Xdebug会减慢PHP的运行速度。

建议在运行ComposerRequireChecker时不使用Xdebug。

如果您无法提供不带Xdebug的PHP实例,尝试为命令设置环境变量,例如:XDEBUG_MODE=off php composer-require-checker

配置

ComposerRequireChecker默认已配置为为某些符号设置白名单。请查看配置文件示例,了解哪些配置选项可用。

您现在可以根据需要调整此文件,并告诉composer-require-checker使用它进行配置。如果您想使用默认的白名单,您可以删除此部分,只调整您想要更改的部分。

请注意,如果您想在一个部分之上添加内容,您必须复制整个部分的全部内容。该工具有意只读取一个配置文件。如果您只传递新的设置,您将得到有关PHP核心扩展和内部符号(如truefalse)未定义的错误报告。

bin/composer-require-checker check --config-file=path/to/config.json /path/to/your/project/composer.json

默认情况下,如果存在该文件,它将使用composer-require-checker.json

扫描额外文件

要扫描不属于您自动加载定义的文件,您可以将glob模式添加到配置文件的scan-files部分。

以下示例配置文件还会扫描bin/console文件以及您的bin/文件夹中所有以.php扩展名结尾的文件。

composer-require-checker.json:

{
    "scan-files" : ["bin/console", "bin/*.php"]
}

如果您不喜欢复制工具的默认设置,考虑将这些路径添加到您项目的Composer自动加载部分。

使用方法

ComposerRequireChecker在现有的目录结构上运行。它不会更改您的代码,甚至不会安装您的composer依赖项。这是一项完全由您自己负责的任务,允许您在扫描后更改/改进事物,以查看是否解决了问题。

因此,常规的工作流程将是

  1. 克隆您的仓库
  2. 运行composer install安装依赖项
  3. 运行composer-require-checker check检查您的代码

处理自定义安装插件

ComposerRequireChecker仅从您的项目composer.json中获取有关文件位置的已知信息。它不会使用Composer本身来理解自定义目录结构。

如果您的项目需要使用任何安装插件将文件放入不是vendor/或通过composer.json中的vendor-dir配置设置定义的目录中,ComposerRequireChecker将无法正确检测所需的代码。

作为解决方案,您可以为扫描而仅安装依赖项,不使用插件

  1. 克隆您的仓库
  2. composer install --no-plugins将所有代码放入vendor文件夹
  3. 运行composer-require-checker check检查您的代码
  4. 再次在正确位置安装依赖项composer install

许可

本软件包在MIT许可下提供。

鸣谢

此软件包最初由Marco PivettaMatthias Glaub设计。
以及当然,所有贡献者