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.
Mark Fox
fonte
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 .

Nicolai Fröhlich
fonte
Ó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".

John Kary
fonte
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.

tweini
fonte
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.
Lenybernard
fonte
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.

Layton Everson
fonte
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.

thewbb
fonte