Проблемы с зависимостью lib-icu при установке Symfony 2.3.x через Composer

112

У меня не было проблем с установкой Symfony 2.2.x с помощью Composer, я всегда просто копировал стабильную версию с 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?


Обновление решения

Мне не хватало расширения php intl, которое предоставляет lib-icu

Так просто, установите и настройте расширение 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.ini, выбрав «Файл»> «Редактировать шаблон»> «php. [Версия] .ini».

Командная строка:

  • При использовании Composer или Symfony Console CLI вам также понадобится Intl, и, поскольку phpCLI обычно использует другой, php.iniвы захотите добавить туда директиву расширения. Чтобы найти свой интерфейс командной строки php.ini, просто найдите $ php -i |grep php\.iniпуть к файлу и добавьте extension=intl.soк нему php.ini.
  • Чтобы проверить, установлен ли Intl, вы можете $ php -mпроверить доступные модули.
Марк Фокс
источник
какую ос вы используете? тогда я могу предоставить информацию о том, как обновить ваше расширение intl.
Николай Фрёлих
Не используйте pecl / intl, поскольку он нужен для совместимости с PHP 5.2.x. Начиная с PHP 5.3, Intl является основным расширением.
Jérôme Vieilledent
2
@ JérômeVieilledent, похоже, текущий дистрибутив MAMP не объединяет Intl, что оставляет вам только возможность использовать PECL для его сборки php.net/manual/en/intl.installation.php
Марк Фокс

Ответы:

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()AND на php -mвашем терминале, если расширение было успешно включено.

Проверьте текущие версии intl с php с помощью:

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 не оставила мне уверенности в том, что в игру вступает флаг стабильности.
Марк Фокс,
Я установил php-intl через PEAR / PECL. Почему-то INTL::…не получается. Но я могу видеть через phpinfo () в браузере, что Intl установлен, а версия ICU - 49.x. Однако Composer по-прежнему не работает с тем же сообщением об ошибке.
Марк Фокс
какая операционная система? Например, "sudo aptitude install php5-intl" в ubuntu. расширение включено в php.ini, отображается с помощью php -m из командной строки?
Николай Фрёлих
1
Mac OSX 10.7.5 - при запуске php -mНЕ вижу intl. Я знаю, что он работает на веб-сервере, но не распознается в командной строке. Итак… я должен добавить это в командную строку?
Марк Фокс
Я установил через 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 в разделе «ICU и проблемы развертывания».

Джон Кэри
источник
1
Спасибо за это. Абсурдно, что Symfony2 завершает установку из-за функции, которая должна быть необязательной и не устанавливается во многих средах.
Acyra 08
Извините, но это неправда. Установка symfony 2.3 проанализирует конфигурацию и определит правильный icu-компонент. Он НЕ выключится.
tweini
POC composer.json: "require":{"symfony/symfony": "v2.3.3"}}результат: ´Загрузка репозиториев композитора с информацией о пакете Установка зависимостей (включая require-dev) - Установка psr / log (1.0.0) Скачивание: 100% - Установка twig / twig (v1.13.2) Скачивание: 100% - Установка doctrine / common (2.3.0) Скачивание: 100% - Установка symfony / symfony (v2.3.3) Скачивание: 100% - Установка symfony / icu (v1.0.0) Скачивание: 100% Запись файла блокировки Создание файлов автозагрузки
tweini
1
Как объясняется в документации, проблема возникает, когда composer.lockиспользуется совместно между средами с разными версиями (или отсутствием) Intl.
Tamlyn
Спасибо за это! Скрестив пальцы, я могу запустить свой проект Symfony2 для клиента, который все еще пользуется GoDaddy
Мэтт
15

Решение этой или подобных проблем можно найти здесь: ICU и проблемы развертывания

При выборе правильного 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. без расширения intl.

Но вы можете попасть в ловушку, когда ваша среда разработки отличается от вашего производственного сервера, как указано в этой статье:

  • машины для разработки скомпилированы с ICU 4.4 или выше, но сервер скомпилирован с более низкой версией ICU, чем 4.4
  • расширение intl доступно на машинах для разработки, но не на сервере.

Если у вас нет root-доступа к вашему производственному серверу, вы можете исправить это, как указано в этой статье. (настройка composer.json)

Надеюсь, эта дополнительная информация помогла мне в этом особом случае с разными средами.

Твейни
источник
9

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.
lenybernard
источник
6

Я знаю, что этот ответ может быть неправильным ответом на проблему этого человека, но это было решение моей проблемы с тем же названием. Я смог решить эту проблему для себя, включив расширение intl в php.ini и обновив composer.

Повышение уровня композитора.

php composer.phar self-update

Удалите комментарий из этой строки (в php.ini):

extension=php_intl.dll

А также удалите комментарий к этим двум строкам ниже [intl] в (php.ini):

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

И, конечно, перезапустите apache2. :)

Дополнительная информация:

Если вы используете Mac и установили php с Homebrew, выполните следующие действия:

(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 ;-)
Марк Фокс
1
Да, я использую окна, однако это не "исправление Windows", это исправление конфигурации php и исправление обновления композитора. Те же шаги могут потребоваться и для Linux или Mac.
Layton Everson
Верный. Возможно, вам стоит упомянуть, какой дистрибутив php / apache вы тогда используете. В вашем случае расширение intl входит в комплект, и его просто нужно включить, это отличная новость для всех, кто использует тот же пакет дистрибутива.
Марк Фокс
1
Хороший момент, Марк Фокс. Вот мы для всех, кто в этом нуждается. Я использую стек XAMPP от apachefriends в окне Windows 8. (версия 1.8)
Лейтон Эверсон
1
Для меня это исправлено с помощью XAMPP. Расширение уже было включено, но оно сработало только после добавления [intl] intl.default_locale = en_utf8 intl.error_level = E_WARNING
d0001
5

Лучшее решение - исправить ваш composer.json до версии, необходимой производственному серверу. Сначала определите версию ICU на сервере: 1 2

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

Затем исправьте компонент Icu в файле composer.json до соответствующей версии:

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

Установите версию «1.0. », Если на сервере не установлено расширение intl; «1.1. », Если сервер скомпилирован с ICU 4.2 или ниже.

Наконец, запустите

php composer.phar update symfony/icu

на вашей машине разработки, тщательно протестируйте и разверните снова. Теперь установка зависимостей будет успешной.

thewbb
источник