【问题标题】:How would I only update one composer dependency?我将如何只更新一个作曲家依赖项?
【发布时间】:2013-10-09 12:48:36
【问题描述】:

我预料到了

composer update videlalvaro/php-amqplib

只会更新一个依赖项,但不会更新所有依赖项。

我错过了什么?

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

PPS:使用的作曲家版本是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].

【问题讨论】:

    标签: php composer-php


    【解决方案1】:

    要在更新特定软件包期间克服这种依赖问题,您应该在完全运行更新之前指定所有特定软件包版本。
    在你的情况下是这样的:

    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
    

    【讨论】:

      【解决方案2】:

      出于安全原因,我在 GitHub 存储库上遇到过类似情况。

      我解决了将依赖项更新到特定版本的问题,如下所示:

      composer require phpseclib/phpseclib:2.0.31
      

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

      ddev ssh
      

      【讨论】:

      • 当然取决于项目。对我来说,这个包是一个子依赖,所以它是composer update phpseclib/phpseclib(可以随时查看composer why phpseclib/phpseclib 的依赖列表)。使用roave/securityadvisories 是否检测到您的“安全原因”?我很好奇! ?
      • 只是 GitHub 向我建议了一些漏洞。不管怎样,你推荐的这个包很有趣。
      【解决方案3】:

      tl;博士:

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

      composer update one/dependency second/dependency other/dependency
      

      故事:

      如果您只想更新一个依赖项(composer update some/dependency),您可能会遇到由于某些其他依赖项安装在错误版本中而无法满足请求的问题。而且那个不一定必须在您的composer.json 中列出,它可能只是其他一些依赖项的依赖项。

      例如我只想更新google/apiclient,但调用composer update google/apiclient 抱怨说google/auth(apiclient 的依赖)在版本1.2.3 中需要guzzlehttp/psr7。我安装了1.3.0guzzlehttp/psr7 未在我的 composer.json 中列出。我要做的就是打电话:

      composer update guzzlehttp/psr7 google/apiclient
      

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

      【讨论】:

        【解决方案4】:

        composer update videlalvaro/php-amqplib 命令只是更新了该依赖项。但是它不会禁用 Composer 所做的其他依赖项检查。

        错误消息抱怨的是 lib-icu 在您的系统上不可用。显然这可以通过安装 PHP Intl 扩展来解决。

        如果您在其中一个要求中需要 PHP 5.5 的项目执行 composer update,降级到 PHP 5.4,然后在另一个不需要 PHP 5.5 的要求上运行 composer update,您会看到类似的问题。即使您不会更新需要 PHP 5.5 的需求,该包的需求也无法解析,因此 Composer 会失败。

        在您的情况下,即使您只是尝试将 videlalvaro/php-amqplib 更新到最新版本,也无法满足 symfony/icu 的要求,因此作曲家更新失败。

        编辑

        为了提供帮助,我猜您在上次更新后重新安装了 PHP,并且删除或忘记安装 PHP Intl 扩展。 Composer 无法令人满意地满足您的 composer.json 设置的要求,因此默认不做任何事情,而不是故意在不满足要求的情况下进行更新。

        所以基本上,您需要安装运行现有已安装软件所需的 PHP 扩展,然后 Composer 将能够更新您要更新的单个包,以及满足其他包的要求.

        【讨论】:

        • php5-intl 5.3.10 已安装并加载(phpinfo() 中有相应部分)。而且我没有重新安装任何东西 - 这是我最近下载的 symfony v2.3.5 composer.js,我只是想在那里添加另一个依赖项。
        • @zerkms 似乎是合法的,我正在尝试在 composer.json 上添加一个新的需求,并且只更新它,但是对 exeu/apai-io dev-master 的依赖已更改为更新版本php,现在我不能使用新库(它需要比我安装的版本低的 php 版本要求),因为这是另一个依赖项,即使我不需要更新其他库。
        • 愚蠢的问题:有没有办法“禁用 Composer 所做的其他依赖项检查”?假设我正在更新我自己编写的依赖项,没有第三方共同依赖项依赖于该依赖项,并且我知道如果仅更新该依赖项,则更新不会破坏任何内容。我有什么选择?
        • 我也想知道!我已经厌倦了等待 10 分钟在我正在处理的项目上运行 composer 命令。自从我 5 分钟前运行 composer 以来,我真的不认为所有其他项目都发生了变化。
        猜你喜欢
        • 2016-09-23
        • 1970-01-01
        • 2019-12-02
        • 1970-01-01
        • 2016-12-30
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多