如何在Composer中获取所有已安装软件包及其版本列表?

372
我一直在本地使用Symfony 2.1开发项目。现在我已经将其上传到服务器,但是当我试图使用Composer安装供应商bundles时,出现了很多依赖错误。这可能与最新版本的Symfony刚刚发布有关,而我的composer.json文件没有指定确切的版本号。
有没有办法快速显示我本地机器上所有内容的版本号?
这是我的composer.json文件(直到几天前都可以正常工作):
{
    "name": "symfony/framework-standard-edition",
    "description": "The \"Symfony Standard Edition\" distribution",
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require": {
        "php": ">=5.3.3",
        "symfony/symfony": "2.1.*",
        "doctrine/orm": ">=2.2.3,<2.4-dev",
        "doctrine/doctrine-bundle": "1.0.*",
        "twig/extensions": "1.0.*",
        "symfony/assetic-bundle": "2.1.*",
        "symfony/swiftmailer-bundle": "2.1.*",
        "symfony/monolog-bundle": "2.1.*",
        "sensio/distribution-bundle": "2.1.*",
        "sensio/framework-extra-bundle": "2.1.*",
        "sensio/generator-bundle": "2.1.*",
        "jms/security-extra-bundle": "1.2.*",
        "jms/di-extra-bundle": "1.1.*",
        "sonata-project/admin-bundle": "*",
        "sonata-project/cache-bundle": "dev-master",
        "sonata-project/doctrine-orm-admin-bundle": "dev-master",
        "stof/doctrine-extensions-bundle": "1.1.x-dev",
        "sonata-project/user-bundle": "dev-master",
        "sonata-project/easy-extends-bundle": "dev-master",
        "friendsofsymfony/user-bundle": "2.0.x-dev",
        "friendsofsymfony/jsrouting-bundle": "*",
        "liip/imagine-bundle": "*",
        "simplethings/form-extra-bundle": "dev-master",
        "antimattr/google-bundle": "dev-master",
        "doctrine/doctrine-fixtures-bundle": "dev-master",
        "genemu/form-bundle": "2.1.*",
        "behat/behat":                  "2.4.*@stable",
        "behat/mink":                   "1.4.*@stable",
        "behat/symfony2-extension":     "*@stable",
        "behat/mink-extension":         "*@stable",
        "behat/mink-selenium2-driver":  "*@stable",
        "behat/mink-browserkit-driver":  "*",
        "liip/functional-test-bundle": "dev-master"
    },
    "scripts": {
        "post-install-cmd": [
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
        ],
        "post-update-cmd": [
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
        ]
    },
    "minimum-stability": "dev",
    "extra": {
        "symfony-app-dir": "app",
        "symfony-web-dir": "web"
    },
    "config": {
        "bin-dir": "bin/"
    }
}
9个回答

738
你可以运行composer show -i(缩写为--installed)。
在最新版本中,只需使用composer show-i选项已被弃用。
你也可以使用composer的全局安装: composer global show

使用composer.phar和php获取此内容的任何人都可以编写此代码。 - Yashrajsinh Jadeja
21
“-i”选项现在已被弃用。 composer show默认列出已安装的包。 - herve
2
而且可能不用说,composer show --help会打印出所有可用的选项。 - Gerard Roche
1
composer show vendorName/packageName -a 将显示所有可用版本和要求。 - Eugene Kaurov
使用 composer linked 命令可以显示已链接的包列表。 - jave.web
使用 composer linked 命令可以显示链接包的列表。 - jave.web

75
列出全局安装的 Composer 包:

要列出全局安装的 Composer 包:

composer global show -i

截至2021年,您可以简单地使用“composer global show”。 - Dimitar
"-i,--installed 仅列出已安装的软件包(默认启用,仅适用于向后兼容)。" - jave.web
-i, --installed 仅列出已安装的软件包(默认启用,仅适用于向后兼容)。 - jave.web

30

1
谢谢。我也觉得“-t”标志非常有用。 - Oniya Daniel
树形选项-t确实很有帮助。 - RDB

24

如果你只想检查一个版本,可以这样做

composer show -- twig/twig

请注意,现在默认仅显示已安装的软件包,而已安装选项现已被弃用。


14

这个命令的行为已经被修改,因此您不需要传递-i选项:

[10:19:05] coil@coil:~/workspace/api$ composer show -i
You are using the deprecated option "installed". 
Only installed packages are shown by default now. 
The --all option can be used to show all packages.

6

Ivan的回答很好:

composer global show -i

补充信息:如果你收到类似以下消息:

Composer could not find a composer.json file in ~/.composer

...可能是因为你还没有安装任何包。如果是这样,你可以忽略下一部分消息:

... please create a composer.json file ...

...一旦你安装了一个包,这个消息就会消失。


3

使用composer-runtime-api 2.0+版本,新增了一个InstalledVersions类,其中包含一些静态方法,可以以编程的方式查看相关信息。

例如:

// To list all packages (`string[]`)
\Composer\InstalledVersions::getInstalledPackages();

// To list every details of every packages
\Composer\InstalledVersions::getAllRawData();

更多信息: https://getcomposer.org/doc/07-runtime.md#installed-versions

我遇到了 Class 'Composer\InstalledVersions' not found 的问题。我已经在 composer.json 中的 require 中添加了 "composer-runtime-api": "^2.0"。但是我只能在 AWS Elastic Beanstalk 上进行测试,似乎它没有安装我的包。 - Xitcod13
我正在运行 Laravel 5.8,所以可能与此有关。 - Xitcod13
它应该可以工作,你知道你使用的Composer版本吗? - Fabien Sa

2
如果您想安装Symfony2.2,可以在Symfony博客的更新说明中查看完整的更改内容。
只需按照那些更新说明更新您的composer.json文件,并在此之后运行composer update。这将安装所有新的依赖项和Symfony2.2项目。
如果您不想升级到Symfony2.2,但有依赖项错误,请发布这些错误以便我们进行进一步的帮助。

原来我遇到的问题是由于FOS用户包2x和sonata用户包不兼容所导致的。 - Dan
1
@Dan,我认为这是因为SonataUserBundle没有正确配置。昨天已经修复了这个问题。 - Wouter J

1

有没有一种方法可以通过 $event->getComposer()->getRepositoryManager()->getAllPackages() 来获取它?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接