通过Composer安装Symfony 2.3.x时lib-icu依赖性问题


112

使用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扩展名

如此简单,安装和配置国际扩展。从PHP 5.3开始,默认情况下分发Intl扩展,但是某些分发(例如MAMP)没有Intl,因此您需要获取它。我用了PEAR

我的步骤:

  • 安装Intl扩展名(由PECL维护):$ pear install pecl/intl—您可能必须首先将pecl通道添加到pear。
  • 如果您使用MAMP且从未使用过pear / pecl,请查看lullabot的有用博客文章;MAMP不随PHP源一起提供,因此您必须下载PHP版本的源并将其移入/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,并且由于phpCLI通常使用其他命令行,因此您也php.ini想在其中添加扩展指令。要找到CLI的php.ini,只需$ php -i |grep php\.ini查找文件路径并将其添加extension=intl.so到该php.ini中即可。
  • 要检查是否安装了Intl,可以$ php -m检查可用的模块。

您正在使用哪个操作系统?然后我可以提供有关如何更新您的国际扩展名的信息。
NicolaiFröhlich

不要使用pecl / intl,因为它与PHP 5.2.x兼容。从PHP 5.3开始,Intl是核心扩展。
杰罗姆Vieilledent

2
@JérômeVieilledent,看来当前的MAMP发行版没有捆绑Intl,这仅使您可以选择使用PECL来构建它php.net/manual/en/intl.installation.php
Mark Fox

Answers:


118

更新您的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从终端检查您的AND 。

使用以下命令检查来自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)。在此处阅读更多稳定性标志。


很棒的文章。Composer文档使我不太确定稳定性标志是否起作用。
马克·福克斯

我通过PEAR / PECL安装了php-intl。由于某种原因INTL::…失败。但是,我可以通过浏览器中的phpinfo()看到安装了Intl且ICU版本是49.x。但是,Composer仍然失败,并显示相同的错误消息。
马克·福克斯

哪个操作系统?例如,在ubuntu上安装“ sudo aptitude install php5-intl”。扩展名在php.ini中启用,可从命令行在php -m中看到?
NicolaiFröhlich13年

1
Mac OSX 10.7.5 —运行时,我php -m看不到intl。我知道它可以在Web服务器上运行,但是在命令行上无法识别。所以……我必须将其添加到命令行中吗?
马克·福克斯

我通过Homebrew安装,但php -m仍然无法从CLI识别?
马克·福克斯

21

许多应用程序仅支持“ 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的文档中 “ ICU和部署问题”下对此进行了更详细的介绍。


1
谢谢你 荒谬的是,Symfony2通过应该是可选的功能而不是在许多环境中未安装的功能关闭安装。
Acyra

抱歉,那不是事实。安装symfony 2.3将对配置进行内部检查,并将确定正确的icu组件。它不会关闭。
tweini

POC composer.json:"require":{"symfony/symfony": "v2.3.3"}}结果:´使用包信息加载composer信息库安装依赖项(包括require-dev)-安装psr / log(1.0.0)下载:100%-安装twig / twig(v1.13.2)下载:100% -安装主义/通用(2.3.0)下载:100%-安装symfony / symfony(v2.3.3)下载:100%-安装symfony / icu(v1.0.0)下载:100%编写锁定文件生成自动加载文件
tweini

1
如文档中所述,当composer.lock在具有不同版本(或不存在)Intl的环境之间共享时,会出现此问题。
Tamlyn

谢谢你!用我的双手,我可以为仍在GoDaddy上的客户端运行Symfony2项目
Matt

15

可以在以下位置找到有关此问题或类似问题的解决方案:ICU和部署问题

选择正确的ICU组件时,作曲家的行为应该是明智的:

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

从理论上讲,安装symfony 2.3应该没有错误。没有国际扩展名。

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

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

如果您无权访问生产服务器,则可以按照本文中的说明进行修复。(调整composer.json)

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


9

Mac OS Mavericks附带不带intl的PHP 5.4.17。为此,您必须执行以下步骤:

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.

6

我知道此答案可能不是此人问题的正确答案,但这是我用相同标题解决的问题的解决方案。通过启用php.ini中的intl扩展并升级composer,我能够自己解决此问题。

升级作曲家。

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。


1
看起来这是Windows修复程序;-)
Mark Fox

1
是的,我使用的是Windows,但是,它不是“ Windows修复程序”,而是php配置和composer更新修复程序。在Linux或Mac机器上可能需要采取相同的步骤。
雷顿·埃弗森

正确。也许您应该提到您正在使用的php / apache发行版。在您的情况下,intl扩展是捆绑在一起的,只需要启用即可,对于使用相同发行版软件包的任何人来说,这都是个好消息。
马克·福克斯

1
好点马克·福克斯。在这里,我们适合任何需要它的人。我正在Windows 8盒子上使用来自apachefriends的XAMPP堆栈。(1.8版)
Layton Everson,

1
对我来说,这使用XAMPP进行了修复。该扩展名已启用,但仅在添加[intl] intl.default_locale = en_utf8 intl.error_level = E_WARNING
d0001 2013年

5

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

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

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

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

如果服务器未安装intl扩展名,则将版本设置为“ 1.0。”。“ 1.1。如果服务器使用ICU 4.2或更低版本编译,则为 ”。

最后跑

php composer.phar update symfony/icu

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.