Problemas con la dependencia lib-icu al instalar Symfony 2.3.x a través de Composer

112

No he tenido problemas para instalar Symfony 2.2.x usando Composer, siempre he copiado la versión estable en http://symfony.com/download .

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

(Tengo Composer instalado a nivel mundial)
Curioso acerca de 2.3.0-RC1, pensé que esto funcionaría sin problemas:

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

Pero se apagó por los siguientes errores:

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].

¿Necesito modificar el archivo composer.json?


Actualización de la solución

Me faltaba la extensión php intl que proporciona lib-icu

Tan fácil, instale y configure la extensión intl. A partir de PHP 5.3, la extensión Intl se distribuye de forma predeterminada, pero algunas distribuciones, como MAMP, no tienen Intl, por lo que deberá adquirirla. Solía PERA :

Mis pasos:

  • Instale la extensión Intl (mantenida por PECL): $ pear install pecl/intl- es posible que primero deba agregar el canal pecl a pear.
  • Si usa MAMP y nunca ha trabajado con pear / pecl, consulte la útil publicación del blog de lullabot ; MAMP no se envía con la fuente de php, por lo que debe descargar la fuente de su versión de php y mover la fuente a /Applications/MAMP/bin/php/php[version]/include/php(como se explica en la publicación del blog)
  • PEAR no pudo encontrar mi php.ini, así que tuve que agregarlo manualmente extension=intl.soa php.ini. En MAMP puede editar php.ini fácilmente yendo a Archivo> Editar plantilla> php. [Versión] .ini

Línea de comando:

  • Cuando use Composer o la CLI de la consola de Symfony, también necesitará Intl y, dado que la phpCLI generalmente usa una diferente php.ini, querrá agregar la directiva de extensión allí también. Para encontrar el php.ini de su CLI simplemente haga $ php -i |grep php\.inipara descubrir la ruta del archivo y agregue extension=intl.soa ese php.ini también.
  • Para verificar si Intl está instalado, puede hacerlo $ php -mpara verificar los módulos disponibles.
Mark Fox
fuente
¿Qué sistema operativo estás usando? entonces puedo proporcionar información sobre cómo actualizar su extensión intl.
Nicolai Fröhlich
No use pecl / intl ya que es compatible con PHP 5.2.x. A partir de PHP 5.3, Intl es una extensión principal.
Jérôme Vieilledent
2
@ JérômeVieilledent parece que la distribución actual de MAMP no incluye Intl, lo que solo te deja la opción de usar PECL para construirlo php.net/manual/en/intl.installation.php
Mark Fox

Respuestas:

118

actualice su extensión php-intl , ¡de ahí proviene el error de icu!

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

compruebe que la extensión esté habilitada y configurada correctamente en php.ini también.

(pista: php-cli a veces usa un php.ini diferente)

php.ini

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

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

verifique su phpinfo()AND php -mdesde su terminal si la extensión se ha habilitado con éxito.

Verifique sus versiones intl actuales de php con:

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

atención: ya no es necesario ( Symfony 2.3 ya ha sido lanzado )

agregue la bandera de estabilidad mínima @dev o @rc a su dependencia de esta manera, por favor:

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

La estabilidad predeterminada en Composer es estable, lo que la rama de Symfony 2.3 no es actualmente (es @rc). Lea más sobre indicadores de estabilidad aquí .

Nicolai Fröhlich
fuente
Excelente artículo. La documentación de Composer me dejó sin estar seguro de si la bandera de estabilidad estaba entrando en juego.
Mark Fox
Instalé php-intl a través de PEAR / PECL. Por alguna razón INTL::…falla. Pero, puedo ver a través de phpinfo () en el navegador que Intl está instalado y que la versión de ICU es 49.x. Sin embargo, Composer aún falla con el mismo mensaje de error.
Mark Fox
que sistema operativo? "sudo aptitude install php5-intl" en ubuntu, por ejemplo. extensión habilitada en php.ini, visible con php -m desde la línea de comandos?
Nicolai Fröhlich
1
Mac OSX 10.7.5 - cuando ejecuto php -mNO veo intl. Sé que funciona en el servidor web, pero no se reconoce en la línea de comandos. Entonces ... ¿tengo que agregarlo a la línea de comandos?
Mark Fox
Lo instalé a través de Homebrew, pero php -mtodavía no reconozco desde CLI?
Mark Fox
21

Muchas aplicaciones solo admitirán la configuración regional "en" y no necesitarán capacidades de traducción o php-intl. Si este es usted, o no puede instalar php-intl en su servidor, puede agregar explícitamente symfony / icu ~ 1.0 a su archivo composer.json. 1.0 no requiere php-intl, mientras que 1.1+ sí.

Si no necesita funciones de traducción:

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

Sin esta declaración y tratando de instalar symfony / symfony 2.3 Composer puede intentar instalar symfony / icu ~ 1.2, lo que requeriría que instale php-intl.

Esto se trata explícitamente de forma más extensa en la documentación del componente Symfony Intl bajo "ICU y problemas de implementación".

John Kary
fuente
1
Gracias por esto. Es absurdo que Symfony2 cierre la instalación por una característica que debería ser opcional y no está instalada en muchos entornos.
Acyra
Lo siento, pero eso no es cierto. La instalación de Symfony 2.3 hará una introspección de la configuración y determinará el componente icu correcto. NO se apagará.
tweini
POC composer.json: "require":{"symfony/symfony": "v2.3.3"}}resultado: ´Cargando repositorios de composer con información del paquete Instalando dependencias (incluido require-dev) - Instalando psr / log (1.0.0) Descargando: 100% - Instalando twig / twig (v1.13.2) Descargando: 100% - Instalando doctrine / common (2.3.0) Descargando: 100% - Instalando symfony / symfony (v2.3.3) Descargando: 100% - Instalando symfony / icu (v1.0.0) Descargando: 100% Escribiendo archivo de bloqueo Generando archivos de carga automática
tweini
1
Como se explica en los documentos, el problema surge cuando composer.lockse comparte entre entornos con diferentes versiones (o ausencia) de Intl.
Tamlyn
¡Gracias por esto! Cruzando los dedos, puedo hacer que mi proyecto Symfony2 se ejecute para un cliente que todavía está en GoDaddy
Matt
15

Puede encontrar una solución con respecto a este o problemas similares aquí: ICU y problemas de implementación

El comportamiento del compositor debe ser inteligente seleccionando el componente icu correcto:

  • symfony / icu 1.0. *: cuando la extensión intl no está disponible
  • symfony / icu 1.1. *: cuando intl se compila con ICU 4.0 o superior
  • symfony / icu 1.2. *: cuando intl se compila con ICU 4.4 o superior

No debería haber (teóricamente) ningún error al instalar Symfony 2.3. sin extensión internacional.

Pero puede quedar atrapado cuando su entorno de desarrollo difiere de su servidor de producción como se menciona en este artículo:

  • las máquinas de desarrollo están compiladas con ICU 4.4 o superior, pero el servidor está compilado> con una versión de ICU inferior a 4.4
  • la extensión intl está disponible en las máquinas de desarrollo pero no en el servidor.

Cuando no tenga acceso de root a su servidor de producción, puede arreglarlo como se menciona en este artículo. (retocando composer.json)

Espero que esta información adicional me haya ayudado, ya que me ayudó para este caso especial con diferentes entornos.

tweini
fuente
9

Mac OS Mavericks viene con PHP 5.4.17 sin intl. Para obtener esto, deberá seguir esos pasos:

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
fuente
6

Sé que esta respuesta puede no ser la respuesta correcta al problema de esta persona, pero fue la solución a mi problema con el mismo título. Pude solucionar este problema por mí mismo habilitando la extensión intl en php.ini y actualizando el compositor.

Actualización de compositor.

php composer.phar self-update

Elimine el comentario de esta línea (en php.ini):

extension=php_intl.dll

Y también elimine el comentario de estas dos líneas debajo de [intl] en (php.ini):

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

Y reinicie apache2 por supuesto. :)

Información Adicional:

Si usa mac e instaló php con Homebrew, siga estos pasos:

(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

Reinicie apache.

Layton Everson
fuente
1
Parece que esta es la solución de Windows ;-)
Mark Fox
1
Sí, estoy usando Windows, sin embargo, no es una "solución de Windows", es una configuración de php y una solución de actualización del compositor. Es posible que se deban seguir los mismos pasos en una caja Linux o Mac.
Layton Everson
Correcto. Quizás debería mencionar qué distribución de php / apache está usando entonces. En su caso, la extensión intl está incluida y solo debe habilitarse, eso es una gran noticia para cualquiera que use el mismo paquete de distribución.
Mark Fox
1
Buen punto Mark Fox. Aquí estamos para quien lo necesite. Estoy usando la pila XAMPP de apachefriends en una caja de Windows 8. (versión 1.8)
Layton Everson
1
Para mí, esto lo solucionó usando XAMPP. La extensión ya estaba habilitada, pero funcionó solo después de agregar [intl] intl.default_locale = en_utf8 intl.error_level = E_WARNING
d0001
5

Una mejor solución es arreglar su composer.json a la versión requerida por el servidor de producción. Primero, determine la versión de ICU en el servidor: 1 2

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

Luego, arregle el componente Icu en su archivo composer.json a una versión coincidente:

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

Establezca la versión en "1.0 " si el servidor no tiene instalada la extensión intl; "1.1. " Si el servidor está compilado con ICU 4.2 o inferior.

Finalmente, corre

php composer.phar update symfony/icu

en su máquina de desarrollo, realice pruebas exhaustivas y vuelva a implementar. La instalación de las dependencias ahora se realizará correctamente.

thewbb
fuente