php composer.phar update
做到了这一点(删除了2.3.0包并安装了整个2.2.5 Zend框架):
$ 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包
我的回答并没有完全描述为什么它被降级,因为Composer中的算法非常密集(这就是为什么update
比install
使用.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的文档,了解如何表达不同的包版本。