Problemas com a dependência lib-icu ao instalar Symfony 2.3.x via Composer


112

Não tive problemas para instalar o Symfony 2.2.x usando o Composer, sempre apenas copiei a versão estável em http://symfony.com/download .

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

(Eu tenho o Composer instalado globalmente)
Curioso sobre o 2.3.0-RC1, imaginei que funcionaria bem:

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

Mas foi desligado pelos seguintes erros:

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

Preciso ajustar o arquivo composer.json?


Atualização de solução

Estava faltando a extensão php intl que fornece lib-icu

Tão fácil, instale e configure a extensão intl. A partir do PHP 5.3, a extensão Intl é distribuída por padrão, mas algumas distribuições, como o MAMP, não têm Intl, então você precisará adquiri-lo. Eu usei PEAR :

Meus passos:

  • Instale a extensão internacional (mantida pela PECL): $ pear install pecl/intl- você pode ter que adicionar o canal pecl à pera primeiro.
  • Se você usa MAMP e nunca trabalhou com pear / pecl, verifique a útil postagem de lullabot no blog ; O MAMP não vem com o código-fonte php, então você deve baixar o código-fonte para sua versão php e mover o código-fonte para /Applications/MAMP/bin/php/php[version]/include/php(conforme abordado na postagem do blog)
  • O PEAR não conseguiu encontrar meu php.ini, então tive que adicioná-lo manualmente extension=intl.soao php.ini. No MAMP, você pode editar o php.ini facilmente acessando Arquivo> Editar modelo> php. [Versão] .ini

Linha de comando:

  • Ao usar o Composer ou o console CLI do Symfony, você também precisará do Intl e, uma vez que o phpCLI geralmente usa um diferente, php.inivocê desejará adicionar a diretiva de extensão lá também. Para encontrar o php.ini da CLI, basta $ php -i |grep php\.inidescobrir o caminho do arquivo e adicionar extension=intl.soa esse php.ini também.
  • Para verificar se o Intl está instalado, você pode $ php -mverificar os módulos disponíveis.

qual sistema operacional você está usando? então posso fornecer informações sobre como atualizar sua extensão intl.
— Nicolai Fröhlich

Não use pecl / intl, pois é para compatibilidade com PHP 5.2.x. A partir do PHP 5.3, Intl é uma extensão central.
— Jérôme Vieilledent

2
@ JérômeVieilledent parece que a distribuição MAMP atual não inclui Intl, o que apenas deixa você a opção de usar PECL para compilá-lo. Php.net/manual/en/intl.installation.php
— Mark Fox

Respostas:


118

atualize sua extensão php-intl , é daí que vem o erro icu!

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

verifique se a extensão está habilitada e configurada corretamente no php.ini também.

(dica: php-cli às vezes usa um 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 seu phpinfo()AND php -mem seu terminal se a extensão foi habilitada com sucesso.

Verifique suas versões intl atuais do php com:

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

atenção: não é mais necessário ( symfony 2.3, entretanto, foi lançado )

adicione o sinalizador de estabilidade mínima @dev ou @rc à sua dependência desta forma:

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

A estabilidade padrão no composer é estável que o branch do symfony 2.3 não é atualmente (é @rc). Leia mais um sinalizador de estabilidade aqui .


Ótimo artigo. A documentação do Composer me deixou menos do que certo se o sinalizador de estabilidade estava entrando em ação.
— Mark Fox

Eu instalei o php-intl via PEAR / PECL. Por algum motivo, INTL::…falha. Mas, posso ver via phpinfo () no navegador que Intl está instalado e a versão ICU é 49.x. No entanto, o Composer ainda falha com a mesma mensagem de erro.
— Mark Fox

qual sistema operacional? "sudo aptitude install php5-intl" no ubuntu, por exemplo. extensão habilitada no php.ini, visível com php -m na linha de comando?
— Nicolai Fröhlich

1
Mac OSX 10.7.5 - quando executo php -mNÃO vejo o intl. Eu sei que funciona no servidor web, mas não é reconhecido na linha de comando. Então ... eu tenho que adicioná-lo à linha de comando?
— Mark Fox

Instalei através do Homebrew, mas php -mainda não reconheço do CLI?
— Mark Fox

21

Muitos aplicativos suportarão apenas "en" locale e não precisarão de recursos de tradução ou php-intl. Se este é você, ou você não pode instalar php-intl em seu servidor, você pode adicionar explicitamente symfony / icu ~ 1.0 ao seu composer.json. 1.0 não requer php-intl, enquanto 1.1+ requer.

Se você não precisa de recursos de tradução:

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

Sem esta declaração e tentando instalar o symfony / symfony 2.3 Composer pode tentar instalar o symfony / icu ~ 1.2, o que exigiria que você instale o php-intl.

Isso é explicitamente coberto mais extensivamente na documentação do Symfony Intl Component em "ICU and Deployment Problems".


1
Obrigado por isso. É um absurdo que o Symfony2 desligue a instalação sobre um recurso que deveria ser opcional e não está instalado em muitos ambientes.
— Acyra

Desculpe, mas isso não é verdade. A instalação do symfony 2.3 examinará a configuração e determinará o componente icu correto. Ele NÃO desligará.
— tweini de

POC composer.json: "require":{"symfony/symfony": "v2.3.3"}}resultado: ´Carregando repositórios do composer com informações do pacote Instalando dependências (incluindo require-dev) - Instalando psr / log (1.0.0) Baixando: 100% - Instalando twig / twig (v1.13.2) Baixando: 100% - Instalando doctrine / common (2.3.0) Baixando: 100% - Instalando symfony / symfony (v2.3.3) Baixando: 100% - Instalando symfony / icu (v1.0.0) Baixando: 100% Gravando arquivo de bloqueio Gerando arquivos autoload
— tweini

1
Conforme explicado nos documentos, o problema surge quando composer.locké compartilhado entre ambientes com diferentes versões (ou ausência) de Intl.
— Tamlyn

Obrigado por isso! Cruzando os dedos, posso colocar meu projeto Symfony2 em execução para um cliente que ainda está no GoDaddy
— Matt

15

Uma solução em relação a este ou problemas semelhantes pode ser encontrada aqui: ICU e problemas de implantação

O comportamento do compositor deve ser inteligente ao selecionar o componente icu certo:

  • symfony / icu 1.0. *: quando a extensão intl não está disponível
  • symfony / icu 1.1. *: quando intl é compilado com ICU 4.0 ou superior
  • symfony / icu 1.2. *: quando intl é compilado com ICU 4.4 ou superior

Não deve haver (teoricamente) nenhum erro ao instalar o symfony 2.3. sem extensão intl.

Mas você pode ficar preso quando seu ambiente de desenvolvimento for diferente de seu servidor de produção, conforme mencionado neste artigo:

  • as máquinas de desenvolvimento são compiladas com ICU 4.4 ou superior, mas o servidor é compilado> com uma versão ICU inferior a 4.4
  • a extensão intl está disponível nas máquinas de desenvolvimento, mas não no servidor.

Quando você não tem acesso root ao seu servidor de produção, você pode consertá-lo conforme mencionado neste artigo. (ajustando composer.json)

Espero que esta informação adicional tenha ajudado, pois me ajudou neste caso especial com diferentes ambientes.


9

Mac OS Mavericks vem com PHP 5.4.17 sem intl. Para conseguir isso, você terá que seguir estas etapas:

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

Sei que essa resposta pode não ser a resposta correta para o problema dessa pessoa, mas foi a solução para o meu problema com o mesmo título. Consegui consertar esse problema para mim habilitando a extensão intl no php.ini e atualizando o composer.

Atualizando o compositor.

php composer.phar self-update

Remova o comentário desta linha (em php.ini):

extension=php_intl.dll

E também remova o comentário dessas duas linhas abaixo [intl] em (php.ini):

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

E reinicie o apache2, é claro. :)

Informação adicional:

Se estiver usando mac e php instalado com o Homebrew, siga estas etapas:

(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 o apache.


1
Parece que esta é a correção do Windows ;-)
— Mark Fox

1
Sim, estou usando o windows, no entanto, não é um "windows fix" é uma correção de atualização de configuração e composição de php. As mesmas etapas podem precisar ser executadas em uma caixa Linux ou Mac.
— Layton Everson

Corrigir. Talvez você deva mencionar qual distribuição php / apache está usando. No seu caso, a extensão intl está agrupada e só precisa ser habilitada, isso é uma ótima notícia para qualquer pessoa que use o mesmo pacote de distro.
— Mark Fox

1
Bom ponto, Mark Fox. Aqui estamos nós para quem precisar. Estou usando a pilha XAMPP do apachefriends em uma caixa do Windows 8. (versão 1.8)
— Layton Everson

1
Para mim, isso consertou usando o XAMPP. A extensão já estava habilitada, mas funcionou apenas após adicionar [intl] intl.default_locale = en_utf8 intl.error_level = E_WARNING
— d0001

5

Uma solução melhor é corrigir seu composer.json para a versão exigida pelo servidor de produção. Primeiro, determine a versão ICU no servidor: 1 2

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

Em seguida, corrija o componente Icu em seu arquivo composer.json para uma versão correspondente:

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

Defina a versão como "1.0. " Se o servidor não tiver a extensão intl instalada; "1.1. " Se o servidor for compilado com ICU 4.2 ou inferior.

Finalmente, corra

php composer.phar update symfony/icu

em sua máquina de desenvolvimento, teste extensivamente e implante novamente. A instalação das dependências agora será bem-sucedida.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.