我使用 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-icu 的 php intl 扩展
如此简单,安装和配置 intl 扩展。自 PHP 5.3 起,默认分发 Intl 扩展,但某些分发,如 MAMP,没有 Intl,因此您需要获取它。我用梨:
我的步骤:
安装 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,并且由于 php CLI 通常使用不同的 php.ini,您也需要在其中添加扩展指令。要查找 CLI 的 php.ini,只需执行 $ php -i |grep php\.ini 以发现文件路径并将 extension=intl.so 也添加到该 php.ini 中。
要检查是否安装了 Intl,您可以执行 $ php -m 来检查可用模块。
更新您的 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()
AND 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 中的默认稳定性是 stable 哪个 symfony 2.3 分支当前不是稳定的(它是 @rc )。阅读更多稳定性标志 here。
许多应用程序只支持“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。
这在“ICU 和部署问题”下的 Symfony Intl Component's docs 中有更广泛的明确介绍。
"require":{"symfony/symfony": "v2.3.3"}}
结果:'使用包信息加载 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 版本(或不存在)的环境之间共享时,就会出现问题。
可以在此处找到有关此问题或类似问题的解决方案:ICU and Deployment Problems
作曲家的行为应该是智能地选择正确的 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)
希望这些附加信息对我有所帮助,因为它对我在不同环境下的这种特殊情况有所帮助。
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.
我知道这个答案可能不是这个人问题的正确答案,但它是我同名问题的解决方案。通过在 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
重启阿帕奇。
更好的解决方案是将您的 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
在您的开发机器上,广泛测试并再次部署。依赖项的安装现在将成功。
不定期副业成功案例分享
INTL::…
失败。但是,我可以通过浏览器中的 phpinfo() 看到安装了 Intl 并且 ICU 版本是 49.x。但是,Composer 仍然失败并显示相同的错误消息。php -m
时,我看不到 intl。我知道它可以在网络服务器上运行,但在命令行上无法识别。所以……我必须将它添加到命令行?php -m
仍然无法从 CLI 中识别?