如何在 Composer 中显示需要包的内容

Posted

技术标签:

【中文标题】如何在 Composer 中显示需要包的内容【英文标题】:How to show what requires a package in Composer 【发布时间】:2017-09-15 13:14:28 【问题描述】:

我的 Composer 刚刚告诉我某个包 foo/bar 被废弃了。

但是,它没有在我的composer.json 中列出,因此其他一些包将其作为依赖项。

如何让 Composer 向我展示这个?

例如,它可能会告诉我我的根 composer.json 需要 a/b,这需要 c/d,而 c/d 又需要有问题的 foo/bar。

【问题讨论】:

【参考方案1】:
composer show --tree

将您的依赖项列为树。如果您传递一个包名,它将显示该包的依赖关系树。

查看文档了解更多信息:https://getcomposer.org/doc/03-cli.md#show

【讨论】:

这很好,但不完整。例如,我的作曲家告诉我“请求的包 foo/bar”存在约束问题,但“composer show --tree foo/bar”却说找不到。 @joachim 这很奇怪,因为它应该列出所有已安装的软件包,包括。子包由于其文档。是否有可能需要 foo/bar 的软件包由于限制而未安装,因此不在树中?如果我们能看到您的composer.json 以及完整的错误消息和您尝试执行的操作说明,会更容易找到解决方案。 确实,由于限制,foo/bar 不会安装。所以我想知道约束的层次结构是什么,这样我才能解决问题。 另外,我尝试使用已安装的软件包,这似乎与我所问的相反:例如,'composer show --tree symfony-cmf/routing' 似乎向我展示symfony-cmf/routing 需要什么,而不是请求 symfony-cmf/routing。 看看prohibits command then:它告诉你哪些包阻止了给定包的安装。【参考方案2】:

当你有一个 deep 依赖的包名,并且你想知道它属于哪个 root 依赖时,使用composer depends

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 0 installs, 0 updates, 0 removals
Package guzzle/guzzle is abandoned, you should avoid using it. Use guzzlehttp/guzzle instead.
Writing lock file
Generating autoload files

$ composer depends guzzle/guzzle
aws/aws-sdk-php  2.8.31  requires  guzzle/guzzle (~3.7) 

您对another answer 的评论表明您正在尝试解决依赖问题。这是一个使用depends 的示例:

$ composer require phan/phan
Using version ^1.1 for phan/phan
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for composer/xdebug-handler (locked at 1.1.0) -> satisfiable by composer/xdebug-handler[1.1.0].
    - phan/phan 1.1.0 requires composer/xdebug-handler ^1.3 -> satisfiable by composer/xdebug-handler[1.3.0].
    - phan/phan 1.1.1 requires composer/xdebug-handler ^1.3 -> satisfiable by composer/xdebug-handler[1.3.0].
    - phan/phan 1.1.2 requires composer/xdebug-handler ^1.3 -> satisfiable by composer/xdebug-handler[1.3.0].
    - phan/phan 1.1.3 requires composer/xdebug-handler ^1.3 -> satisfiable by composer/xdebug-handler[1.3.0].
    - phan/phan 1.1.4 requires composer/xdebug-handler ^1.3 -> satisfiable by composer/xdebug-handler[1.3.0].
    - Conclusion: don't install composer/xdebug-handler 1.3.0
    - Installation request for phan/phan ^1.1 -> satisfiable by phan/phan[1.1.0, 1.1.1, 1.1.2, 1.1.3, 1.1.4].

Installation failed, reverting ./composer.json to its original content.

$ composer depends composer/xdebug-handler
friendsofphp/php-cs-fixer  v2.12.1  requires  composer/xdebug-handler (^1.0)

所以,我想要phan/phan,但由于composer/xdebug-handler 上的版本问题而失败了,这不是我曾经明确要求的包。

然后我询问哪些包“依赖”composer/xdebug-handler 并发现 friendsofphp/php-cs-fixer 需要它(我知道那个包,它是根依赖的)。

然后我注意到phan/phan 想要composer/xdebug-handler:^1.3 并且(来自依赖)friendsofphp/php-cs-fixer 允许我拥有 1.3 版。所以现在我只是做一个更新:

$ composer update composer/xdebug-handler
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Updating composer/xdebug-handler (1.1.0 => 1.3.0): Loading from cache
Writing lock file
Generating autoload files

$ composer require phan/phan
Using version ^1.1 for phan/phan
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 5 installs, 0 updates, 0 removals
  - Installing sabre/event (5.0.3): Loading from cache
  - Installing microsoft/tolerant-php-parser (v0.0.15): Loading from cache
  - Installing netresearch/jsonmapper (v1.4.0): Loading from cache
  - Installing felixfbecker/advanced-json-rpc (v3.0.3): Loading from cache
  - Installing phan/phan (1.1.4): Loading from cache
phan/phan suggests installing ext-ast (Needed for parsing ASTs (unless --use-fallback-parser is used). php-ast ^0.1.5|^1.0.0 is needed.)
Writing lock file
Generating autoload files

【讨论】:

【参考方案3】:

composer depends--tree 选项一起使用。

示例:假设我想查看哪些包依赖于doctrine/data-fixtures 包直至_root_ 包的树结构。

composer depends --tree doctrine/data-fixtures

输出:

doctrine/data-fixtures 1.4.0 Data Fixtures for all Doctrine Object Managers
└──doctrine/doctrine-fixtures-bundle 3.3.0 (requires doctrine/data-fixtures ^1.3)
   └──__root__ (requires (for development) doctrine/doctrine-fixtures-bundle ^3.3)

【讨论】:

【参考方案4】:

这个问题已经回答了,但是在我看来,Composer 提供了一种更雄辩的方式,这是以前没有提到的:depends 命令别名why

composer why 旨在回答 “为什么要安装这个包?” 问题,而不是 “哪些包依赖于这个包?”,我发现很多更容易记住。

作为别名,why 命令的行为与depends 相同,并且上述两个选项仍然适用:

--recursive (-r):递归解析到根包; --tree (-t):将结果打印为嵌套树,隐含-r。

【讨论】:

【参考方案5】:

我不知道解决这个问题的好方法,但我遇到了同样的问题。我从未听说过的一个包裹被警告说它被放弃了。我的解决方案是在 composer.lock 文件中搜索废弃的包名称。它会出现在依赖它的包的 require 或 require-dev 中。

在我的情况下,它有几个级别,包 A 依赖于包 B,而包 B 依赖于废弃的包 C。一旦我确定包 A 是什么,composer show --tree package/a 在树输出中显示废弃的包

【讨论】:

以上是关于如何在 Composer 中显示需要包的内容的主要内容,如果未能解决你的问题,请参考以下文章

作曲家:如何找到一个包的确切版本?

如何在不明确约束所有依赖包的情况下约束与PHP的兼容性

laravel巧用composer

Laravel包的作曲家需要

将 Composer 包添加到 Laravel Providers 数组

如何使用 YUM 列出一个包的内容?