我正在研究Symfony 2.7项目。我运行composer update --dry-run
来检查哪些软件包可能需要更新。 Composer通知了我一个已弃用的软件包:
包symfony / icu被放弃了,你应该避免使用它。使用 symfony / intl而不是。
我只是从composer.json
文件中删除了依赖项,然后再次运行composer update --dry-run
。该消息未再次显示,symfony/icu
已卸载且未安装symfony/intl
。
很好,这意味着其他要求不取决于symfony/icu
或symfony/intl
。 但我可以确定,我自己的代码中不需要这些软件包吗?
我刚刚创建了白色的项目,我不记得为什么我添加了symfony/icu
。我有可能,曾经需要此软件包的代码已被删除,但我不确定。
我使用grep
搜索symfony/icu
的任何导入,但未找到任何内容。但是,这并不能保证,包不会在我的代码中使用,是吗?
有没有办法检查完整 Symfony项目中是否存在需要特定包的依赖项?
答案 0 :(得分:1)
我认为你只能通过自动化测试来实现这一目标。
没有工具(我知道)可以检测是否需要某些包来完成缺失的类。还有可选的依赖项(包没有它们,但是它们会添加一些新功能),所以你会发现缺少类但不需要运行应用程序。
您使用grep
朝着正确的方向前进。 而是寻找命名空间而不是包名。包名称并不总是1:1来打包命名空间。
我会寻找:
查找命名空间
namespace Symfony\Component\Icu;
然后搜索" Symfony \ Component \ Icu"在PhpStorm中的代码或grep
答案 1 :(得分:1)
我认为最干净的方法是从composer
开始并告诉它转储导致您的软件包安装的所有软件包:
例如,我试图找出安装monolog/monolog
的原因:
$ composer depends monolog/monolog
symfony/monolog-bundle 2.11.1 requires monolog/monolog (~1.18)
因monolog/monolog
而安装了symfony/monolog-bundle
。
正如您所说,您可能无意中使用了另一个软件包的依赖项,因此您没有将其添加到依赖项中。
我正如您搜索我的源代码一样使用grep
。请注意,搜索实际的类名称而不是包名称会更好。搜索包名称会为您提供composer.json
个文件,但使用composer depends
比grep
更容易分析:
$ grep --include=\*.php -rnw './vendor' -e 'use Monolog'
./vendor/monolog/monolog/src/Monolog/ErrorHandler.php:16:use Monolog\Handler\AbstractHandler;
./vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php:14:use Monolog\Logger;
./vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php:45: throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s FluentdUnixFormatter');
./vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php:14:use Monolog\Logger;
./vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php:13:use Monolog\Logger;
./vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php:34: throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s NormalizerFormatter');
./vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php:14:use Monolog\Logger;
此命令会搜索所有*.php
个文件,并复制包含Monolog
的行号。
不幸的是,这两种方法只是分析你的代码验尸。真正避免处理这个的最好方法是编写单元测试。然后克隆新的存储库,使用composer install
安装依赖项并运行测试。这应该保证您的代码独立于任何其他不需要的依赖项运行。