【问题标题】:Problems with lib-icu dependency when installing Symfony 2.3.x via Composer通过 Composer 安装 Symfony 2.3.x 时出现 lib-icu 依赖问题
【发布时间】:2013-05-21 03:00:43
【问题描述】:

我使用 Composer 安装 Symfony 2.2.x 没有任何问题,我一直只是在 http://symfony.com/download 复制稳定版本。

composer create-project symfony/framework-standard-edition myproject/ 2.2.1

(我已全局安装 Composer)
对 2.3.0-RC1 感到好奇,我认为这会顺利进行:

composer create-project symfony/framework-standard-edition mynewerproject/ 2.3.0-RC1

但因以下错误而关闭:

Your requirements could not be resolved to an installable set of packages.

Problem 1
    - symfony/icu v1.2.0-RC1 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.1.0-RC1 requires lib-icu >=3.8 -> 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/symfony v2.3.0-RC1 requires symfony/icu >=1.0,<2.0 -> satisfiable by symfony/icu[v1.1.0-RC1, v1.2.0-RC1].
    - Installation request for symfony/symfony 2.3.* -> satisfiable by symfony/symfony[v2.3.0-RC1].

我需要调整 composer.json 文件吗?


解决方案更新

我错过了提供 lib-icuphp intl extension

如此简单,安装和配置 intl 扩展。自 PHP 5.3 起,默认分发 Intl 扩展,但某些分发,如 MAMP,没有 Intl,因此您需要获取它。我用

我的步骤:

  • 安装 Intl 扩展(由 PECL 维护):$ pear install pecl/intl — 您可能需要先将 pecl 通道添加到 pear。
  • 如果您使用 MAMP 并且从未使用过 pear/pecl 检查lullabot's helpful blog post; MAMP 不附带 php 源,因此您必须 download the source for your php version 并将源移动到 /Applications/MAMP/bin/php/php[version]/include/php(如博文中所述)
  • PEAR 找不到我的 php.ini,所以我不得不手动将 extension=intl.so 添加到 php.ini。在 MAMP 中,您可以通过转到文件 > 编辑模板 > php.[version].ini
  • 轻松编辑 php.ini

命令行:

  • 当使用 Composer 或 Symfony 的控制台 CLI 时,您还需要 Intl,并且由于 php CLI 通常使用不同的 php.ini,您还需要在其中添加扩展指令。要查找 CLI 的 php.ini,只需执行 $ php -i |grep php\.ini 以发现文件路径并将 extension=intl.so 添加到该 php.ini 中。
  • 要检查是否安装了 Intl,您可以通过 $ php -m 检查可用模块。

【问题讨论】:

  • 您使用的是哪个操作系统?那么我可以提供有关如何更新您的国际扩展名的信息。
  • 不要使用 pecl/intl,因为它是为了与 PHP 5.2.x 兼容。从 PHP 5.3 开始,Intl 是一个核心扩展。
  • @JérômeVieilledent 似乎当前的 MAMP 发行版没有捆绑 Intl,这只让您可以选择使用 PECL 来构建它php.net/manual/en/intl.installation.php

标签: php symfony composer-php


【解决方案1】:

更新你的 php-intl 扩展,这就是 icu 错误的来源!

sudo aptitude install php5-intl                 // i.e. ubuntu
brew install icu4c                              // osx

检查扩展是否已启用并在 php.ini 中正确配置。

(提示:php-cli 有时使用不同的 php.ini)

php.ini

extension=intl.so       ; *nix
extension=php_intl.dll  ; windows

[intl]
intl.default_locale = en_utf8
intl.error_level = E_WARNING

如果扩展已成功启用,请从终端检查您的 phpinfo()php -m

使用以下命令从 php 检查您当前的 intl 版本:

Intl::getIcuVersion();
Intl::getIcuDataVersion();

注意:不再需要symfony 2.3 已同时发布

请像这样将最低稳定性标志@dev 或@rc 添加到您的依赖项中:

composer create-project symfony/framework-standard-edition mynewerproject/ 2.3.*@dev 

composer 中的默认稳定性是 symfony 2.3 分支当前不是稳定的(它是 @rc )。阅读更多稳定性标志here

【讨论】:

  • 很棒的文章。 Composer 文档让我不确定稳定性标志是否正在发挥作用。
  • 我通过 PEAR/PECL 安装了 php-intl。出于某种原因,INTL::… 失败了。但是,我可以通过浏览器中的 phpinfo() 看到安装了 Intl 并且 ICU 版本是 49.x。但是,Composer 仍然失败并显示相同的错误消息。
  • 哪个操作系统?例如,在 ubuntu 上的“sudo aptitude install php5-intl”。在 php.ini 中启用扩展,在命令行中使用 php -m 可见?
  • Mac OSX 10.7.5 — 当我运行 php -m 时,我看不到 intl。我知道它可以在网络服务器上运行,但在命令行上无法识别。所以……我必须将它添加到命令行?
  • 我通过 Homebrew 安装,但 php -m 仍然无法从 CLI 中识别?
【解决方案2】:

许多应用程序只支持“en”语言环境,不需要翻译功能或 php-intl。如果是你,或者你不能在你的服务器上安装 php-intl,你可以显式地将symfony/icu ~1.0 添加到你的composer.json。 1.0 不需要 php-intl,而 1.1+ 需要。

如果您不需要翻译功能:

$ php bin/composer.phar require symfony/icu ~1.0

如果没有此声明并尝试安装 symfony/symfony 2.3 Composer 可能会尝试安装 symfony/icu ~1.2,这需要您安装 php-intl。

这在 Symfony Intl Component's docs 的“ICU 和部署问题”下得到了更广泛的明确介绍。

【讨论】:

  • 谢谢。 Symfony2 通过一个应该是可选的并且在许多环境中没有安装的功能而关闭安装是荒谬的。
  • 对不起,这不是真的。安装 symfony 2.3 将自省配置并确定正确的 icu 组件。它不会关闭。
  • POC composer.json :"require":{"symfony/symfony": "v2.3.3"}} result: '使用包信息加载 composer 存储库安装依赖项(包括 require-dev) - 安装 psr/log (1.0.0)下载:100% - 安装 twig/twig (v1.13.2) 下载:100% - 安装教义/common (2.3.0) 下载:100% - 安装 symfony/symfony (v2.3.3) 下载:100% - 安装 symfony/ icu (v1.0.0) 下载:100% 写入锁定文件 生成自动加载文件
  • 正如文档中所解释的,当composer.lock 在具有不同版本(或不存在)Intl 的环境之间共享时会出现问题。
  • 谢谢!祈祷我可以让我的 Symfony2 项目为仍在使用 GoDaddy 的客户运行
【解决方案3】:

可以在此处找到有关此问题或类似问题的解决方案:ICU and Deployment Problems

composer 的行为应该是智能选择正确的 icu 组件:

  • symfony/icu 1.0.*:当 intl 扩展不可用时
  • symfony/icu 1.1.*:当 intl 使用 ICU 4.0 或更高版本编译时
  • symfony/icu 1.2.*:当 intl 使用 ICU 4.4 或更高版本编译时

安装 symfony 2.3 应该(理论上)没有错误。没有国际扩展名。

但是当您的开发环境不同于本文中提到的生产服务器时,您可能会陷入困境:

  • 开发机器使用 ICU 4.4 或更高版本编译,但服务器编译>使用低于 4.4 的 ICU 版本
  • intl 扩展在开发机器上可用,但在服务器上不可用。

如果您没有对生产服务器的 root 访问权限,您可以按照本文所述进行修复。 (调整 composer.json)

希望这些额外信息对我有所帮助,因为它对我在不同环境下的这种特殊情况有所帮助。

【讨论】:

    【解决方案4】:

    Mac OS Mavericks 附带 PHP 5.4.17,没有 intl。为此,您必须按照以下步骤操作:

    brew install icu4c
    sudo pecl install intl 
    The path to the ICU libraries and headers is: /usr/local/opt/icu4c/
    Edit /etc/php.ini and add extension=intl.so to the end.
    

    【讨论】:

      【解决方案5】:

      我知道这个答案可能不是这个人问题的正确答案,但它是我同名问题的解决方案。我可以通过在 php.ini 中启用 intl 扩展并升级作曲家来为自己解决这个问题。

      升级作曲家。

      php composer.phar self-update
      

      从此行中删除注释(在 php.ini 中):

      extension=php_intl.dll
      

      同时删除 (php.ini) 中 [intl] 下面这两行的注释:

      [intl]
      intl.default_locale = en_utf8
      intl.error_level = E_WARNING
      

      当然要重启 apache2。 :)

      其他信息:

      如果您使用 mac 并使用 Homebrew 安装 php,请按照以下步骤操作:

      (PHP 5.4)

      $ brew install php54-intl
      

      (PHP 5.5)

      $ brew tap josegonzalez/php
      $ brew tap homebrew/dupes
      $ brew install josegonzalez/php/php55-intl
      $ sudo apachectl restart
      

      重启apache。

      【讨论】:

      • 看起来这是 Windows 修复 ;-)
      • 是的,我使用的是 windows,但是,它不是“windows 修复”,它是 php 配置和 composer 更新修复。可能需要在 linux 或 mac 机器上执行相同的步骤。
      • 正确。也许您应该提及您正在使用的 php/apache 发行版。在您的情况下,intl 扩展被捆绑并且只需要启用,这对于使用相同发行包的任何人来说都是个好消息。
      • 好点马克福克斯。我们在这里为任何需要它的人服务。我在 Windows 8 机器上使用来自 apachefriends 的 XAMPP 堆栈。 (1.8版)
      • 对我来说,这是使用 XAMPP 修复的。该扩展已启用,但仅在添加 [intl] intl.default_locale = en_utf8 intl.error_level = E_WARNING 后才有效
      【解决方案6】:

      更好的解决方案是将您的 composer.json 修复为生产服务器所需的版本。首先,确定服务器上的ICU版本: 1 2

      $ php -i | grep ICU
      ICU version => 4.2.1
      

      然后将 composer.json 文件中的 Icu 组件修复为匹配的版本:

      "require: {
          "symfony/icu": "1.1.*"
      }
      

      将版本设置为 "1.0." 如果服务器没有安装 intl 扩展; "1.1." 如果服务器是用 ICU 4.2 或更低版本编译的。

      最后,运行

      php composer.phar update symfony/icu
      

      在您的开发机器上进行广泛测试并再次部署。依赖项的安装现在将成功。

      【讨论】:

        猜你喜欢
        • 2014-01-27
        • 1970-01-01
        • 2015-04-06
        • 2013-11-04
        • 2019-08-03
        • 2022-01-13
        • 2016-09-15
        • 1970-01-01
        • 2021-06-05
        相关资源
        最近更新 更多