为什么作曲家降级我的包裹?

时间:2014-04-17 18:11:15

标签: php composer-php

php composer.phar update做了这个(删除了2.3.0软件包并安装了整个2.2.5 Zend Framework):

$ php composer.phar update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Removing zendframework/zend-filter (2.3.0)
  - Removing zendframework/zend-view (2.3.0)
  - Removing zendframework/zend-eventmanager (2.3.0)
  - Removing zendframework/zend-loader (2.3.0)
  - Removing zendframework/zend-escaper (2.3.0)
  - Removing zendframework/zend-log (2.3.0)
  - Removing zendframework/zend-servicemanager (2.3.0)
  - Removing zendframework/zend-stdlib (2.3.0)
  - Installing zendframework/zendframework (2.2.5)
    Loading from cache
Writing lock file
Generating autoload files

为什么这样做?我的composer.json看起来像这样,并没有提出指导上述事件过程的那种:

"repositories":[
    {
        "type":"composer",
        "url":"https://packagist.org/"
    },
    {
         "type":"composer",
         "url":"http://packages.zendframework.com/"
    }
],
"require": {
    "zendframework/zend-log" : "2.*",
    "zendframework/zend-escaper" : "2.*",
    "zendframework/zend-filter" : "2.*",
    "zendframework/zend-view" : "2.*"
}

我的期望是:删除2.3.0,安装2.3.1软件包

1 个答案:

答案 0 :(得分:3)

我的回答并没有完全描述为什么降级,因为Composer中的算法非常密集(这就是updateinstall更长的原因。一个.lock)。它们遍历所有依赖项,所有潜在版本以及每个依赖项的版本依赖项。在获得所有这些信息之后,它试图想出一个“完美”的匹配。

有时,您的依赖项或依赖项的依赖项中的最轻微更改可能会产生剧烈的变化。此外,您有时会发现无法解析您的依赖项,因为一个依赖项可能需要symfony/http-foundation ~2.5,而另一个可能需要symfony/http-foundation 2.1.*(这不是您的情况所发生的情况,但它很好知道)。

总而言之,故事的寓意是你应该尽可能具体地使用composer.json(特别是在制作中)。这样,您可以始终控制您使用的版本,而不是让Composer决定。更糟糕的情况是,您运行composer update并且它无法解析您的依赖项。然后对Packagist进行一些研究,看看哪些版本将很乐意一起解决。

我建议使用版本~2.3(与>= 2.3< 3)或2.3.*相同。然后Composer甚至不会尝试版本2.2.5。查看Composer's documentation,了解如何表达不同的软件包版本。