我该如何仅更新一个composer依赖项?

51

我原本期望那样

composer update videlalvaro/php-amqplib

只想更新一个依赖项,但最终更新了所有依赖项。

我漏掉了什么?

PS:此依赖项在composer.json中定义为"videlalvaro/php-amqplib": "2.2.0"

PPS:使用的Composer版本为3da05c68f9561fa822c522b1815435ff990493ff 2013-10-02 14:25:06

PPPS:实际输出:

$ composer.phar update videlalvaro/php-amqplib --no-dev
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - symfony/icu v1.2.0 requires lib-icu >=4.4 -> the requested linked library icu has the wrong version installed or is missing from your system, make sure to have the extension providing it.
    - symfony/icu v1.2.0 requires lib-icu >=4.4 -> the requested linked library icu has the wrong version installed or is missing from your system, make sure to have the extension providing it.
    - Installation request for symfony/icu == 1.2.0.0 -> satisfiable by symfony/icu[v1.2.0].
4个回答

53
命令composer update videlalvaro/php-amqplib只是更新了该依赖项。但它并没有禁用Composer进行的其他依赖项检查。
错误消息抱怨的是你的系统上没有可用的lib-icu。显然,安装PHP Intl扩展程序会解决这个问题。
如果你对需要PHP 5.5的项目进行了composer update,然后降级到了PHP 5.4,并在另一个不需要PHP 5.5的require中运行了composer update,那么你将看到类似的问题。即使你没有更新需要PHP 5.5的require,该包的要求也无法解决,因此Composer会失败。
在你的情况下,即使你只是想将videlalvaro/php-amqplib更新到最新版本,symfony/icu的要求也未得到满足,因此composer update失败。 编辑 为了尝试提供帮助,我猜测你重新安装了PHP,然后删除或忘记安装了PHP Intl扩展。Composer无法满足你的composer.json设置的要求,因此默认不做任何事情,而不是在知道要求未得到满足的情况下进行更新。
因此,基本上你需要安装所需的PHP扩展以使现有已安装的软件运行,并且Composer将能够更新你想要更新的单个包,同时满足其他软件包的要求。

php5-intl 5.3.10 已安装并加载(在 phpinfo() 中有相应的部分)。而我没有重新安装任何东西 - 这是一个最近下载的 symfony v2.3.5 的 composer.js,我只想在那里添加另一个依赖项。 - zerkms
@zerkms 看起来很正常,我正在尝试在composer.json上添加一个新的require,并仅更新它,但是exeu/apai-io dev-master的依赖关系已更改为较新版本的php,现在我无法使用新库(需要低于我的安装版本的php版本要求),因为另一个依赖项,即使我不需要更新其他库。 - appartisan
3
愚蠢的问题:有没有办法“禁用Composer进行的其他依赖项检查”? 假设我正在更新一个我自己编写的依赖项,没有第三方共同依赖项依赖它,而且我确信如果仅更新该依赖项,更新不会破坏任何内容。 那么我的选择是什么? - Illya Moskvin
1
我也想知道!我已经厌倦了在我正在工作的项目上运行composer命令需要等待10分钟。我真的不认为自从我5分钟前运行composer以来所有这些其他项目都发生了变化。 - David Newcomb

39

简而言之:

您可以在一条命令中列出多个要更新的依赖项:

composer update one/dependency second/dependency other/dependency
如果您只想更新一个依赖项(composer update some/dependency),则可能会遇到问题,由于某个其他依赖项安装了错误的版本,请求无法满足。而且那个依赖项不一定必须在您的composer.json中列出,它可能只是某个其他依赖项的依赖项。
例如,我想仅更新google/apiclient,但调用composer update google/apiclient时,它抱怨说google/auth(apiclient的依赖项)需要guzzlehttp/psr7版本为1.2.3。我已经安装了1.3.0版本。 guzzlehttp/psr7没有列在我的composer.json中。我所要做的就是调用:
composer update guzzlehttp/psr7 google/apiclient

就是这样!只需更新您想要的软件包,如果Composer提示您需要更新(或降级:-)其他软件包,请在命令中列出它。


0

我曾经在一个GitHub仓库中遇到了类似的情况,原因是出于安全考虑。

我解决了这个问题,通过更新依赖项到特定的版本,就像这样:

composer require phpseclib/phpseclib:2.0.31

如果您正在使用虚拟环境,例如Docker容器(ddev、lando等),在运行之前应该使用以下命令连接到容器:

ddev ssh

当然,这取决于项目。对我来说,这个包是一个子依赖项,所以是 composer update phpseclib/phpseclib(可以随时检查 composer why phpseclib/phpseclib 获取依赖列表)。你使用 roave/securityadvisories 是否因为“安全原因”被检测到了?我很好奇! - bluemwhitew
1
这只是GitHub向我建议一些漏洞。不管怎样,您提供的这个包非常有趣。 - Davide Casiraghi

0

为了在更新特定软件包时克服这种依赖问题,您应该在同时运行它们的更新之前指定所有特定软件包的版本。
在您的情况下,应该是这样的:

composer require videlalvaro/php-amqplib:2.2.0 --no-update
composer require symfony/icu:1.2.0 --no-update
composer require lib-icu:4.4 --no-update

composer update videlalvaro/php-amqplib symfony/icu lib-icu

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