我做了一个使用ext-mysqli的作曲家包"foo"。在我的开发框上,mysqli 扩展存在,因此我对此包的所有测试都成功,没有任何问题。但是,如果这个软件包会落在一个没有安装 mysqli 扩展的盒子上,那么它将惨败。Composer 通过在"require"、"require-dev"和"suggest"部分中允许"ext-*"来解决此问题。但是包开发人员应该记住实际放置这些依赖项。显然,在发布一个包之前,没有什么可以阻止开发人员(或至少警告)的包,而没有将所有使用的扩展列为依赖项。
由于今天有大量可用的扩展,很容易忽略这些依赖项,特别是当它们总是对用于开发特定包的开发盒感到满意时,因此没有本地测试会揭示它们的缺失。
是否有任何工具可以检查作曲家包以查看它是否使用特定的扩展名,并警告使用的扩展是否未实际在 composer.json 中列出?
感谢Jens A. Koch的回答,我决定制作这样的工具。它可以在 packagist.org 上作为逻辑/extcheck包找到。
正如预期的那样,它从已安装的扩展构建一个字典,然后解析自动加载和自动加载开发部分中引用的源代码。
由于一个简单的原因,它没有被实现为嗅探:CodeSniffer 主要关注 PHP/JS/CSS 文件,而不是 composer.json。
基本上要使用它,您只需要将"logics/extcheck"包添加到composer.json的"require-dev"部分,运行"composer update",然后运行"vendor/bin/extcheck"。它将为您提供代码实际使用但在 composer.json 中未提及的所有扩展。使用 -v 选项调用它,还会为您提供有关扩展使用的信息。
值得注意的是,原始问题很普遍,即使是众所周知/顶级软件包实际上也缺少扩展依赖项。如果您认为您已经将所有必需的扩展添加到 composer.json,请尝试 extcheck - 我敢!:)
ComposerRequireChecker 应该正是您要查找的内容。
可以通过作曲家安装的 CLI 工具
composer require maglnet/composer-require-checker
并通过以下方式使用
composer-require-checker check /path/to/your/project/composer.json
是否有任何工具可以检查作曲家包以查看它是否使用特定的扩展名,并警告使用的扩展是否未实际在 composer.json 中列出?
不,这样的工具还不存在(尚不存在)。
您需要解析源代码以确定使用的扩展。可能是通过在字典中查找它们(用于扩展提供的函数和常量)。
例如,您可以将其编写为 PHPCodeSniffer 的自定义嗅探。