Problemi con la dipendenza lib-icu durante l'installazione di Symfony 2.3.x tramite Composer


112

Non ho avuto problemi ad installare Symfony 2.2.x usando Composer, ho sempre copiato la versione stabile su http://symfony.com/download .

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

(Ho Composer installato a livello globale)
Curioso di 2.3.0-RC1, ho pensato che sarebbe andato liscio:

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

Ma è stato arrestato dai seguenti errori:

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

Devo modificare il file composer.json?


Aggiornamento della soluzione

Mi mancava l' estensione php intl che fornisce lib-icu

Così facile, installa e configura l'estensione intl. A partire da PHP 5.3 l'estensione Intl è distribuita di default, ma alcune distribuzioni, come MAMP, non hanno Intl, quindi dovrai acquisirla. Ho usato PEAR :

I miei passi:

  • Installa l'estensione Intl (gestita da PECL): $ pear install pecl/intl- potresti dover prima aggiungere il canale pecl a pera.
  • Se usi MAMP e non hai mai lavorato con pear / pecl controlla l'utile post sul blog di lullabot ; MAMP non viene fornito con il sorgente php, quindi devi scaricare il sorgente per la tua versione php e spostare il sorgente in /Applications/MAMP/bin/php/php[version]/include/php(come spiegato nel post del blog)
  • PEAR non è riuscita a trovare il mio php.ini, quindi ho dovuto aggiungerlo manualmente extension=intl.soa php.ini. In MAMP puoi modificare facilmente php.ini andando su File> Modifica modello> php. [Versione] .ini

Riga di comando:

  • Quando si usa Composer o la CLI della console di Symfony avrete bisogno anche di Intl e poiché la phpCLI di solito usa un diverso php.ini, vorrete aggiungere anche lì la direttiva extension. Per trovare php.ini della tua CLI, devi semplicemente $ php -i |grep php\.iniscoprire il percorso del file e aggiungerlo anche extension=intl.soa php.ini.
  • Per verificare se Intl è installato puoi fare $ php -mper controllare i moduli disponibili.

quale sistema operativo stai usando? quindi posso fornire informazioni su come aggiornare l'estensione intl.
Nicolai Fröhlich

Non utilizzare pecl / intl poiché è compatibile con PHP 5.2.x. A partire da PHP 5.3, Intl è un'estensione principale.
Jérôme Vieilledent

2
@ JérômeVieilledent sembra che la distribuzione di MAMP corrente non fascio Intl cui si lascia solo la possibilità di utilizzare PECL per costruirlo php.net/manual/en/intl.installation.php~~V~~singular~~3rd
Mark Fox

Risposte:


118

aggiorna la tua estensione php-intl , ecco da dove viene l'errore icu!

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

controlla che l'estensione sia abilitata e configurata correttamente anche in php.ini.

(suggerimento: php-cli a volte usa un php.ini diverso)

php.ini

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

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

controlla il tuo phpinfo()AND php -mdal tuo terminale se l'estensione è stata abilitata con successo.

Controlla le tue attuali versioni intl da php con:

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

attenzione: non più necessario ( symfony 2.3 è stato nel frattempo rilasciato )

aggiungi il flag di stabilità minima @dev o @rc alla tua dipendenza in questo modo:

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

La stabilità predefinita in composer è stabile, il ramo di symfony 2.3 non è attualmente (è @rc). Maggiori informazioni su un flag di stabilità qui .


Ottimo articolo. La documentazione di Composer mi ha lasciato meno che certo se fosse entrato in gioco il flag di stabilità.
Mark Fox

Ho installato php-intl tramite PEAR / PECL. Per qualche motivo INTL::…fallisce. Ma posso vedere tramite phpinfo () nel browser che Intl è installato e la versione ICU è 49.x. Tuttavia, Composer non riesce ancora con lo stesso messaggio di errore.
Mark Fox

quale sistema operativo? "sudo aptitude install php5-intl" su ubuntu per esempio. estensione abilitata in php.ini, visibile con php -m dalla riga di comando?
Nicolai Fröhlich

1
Mac OSX 10.7.5 - quando eseguo php -mNON vedo intl. So che funziona sul server web, ma non viene riconosciuto dalla riga di comando. Quindi ... devo aggiungerlo alla riga di comando?
Mark Fox

Ho installato tramite Homebrew, ma php -mcontinuo a non riconoscerlo dalla CLI?
Mark Fox

21

Molte applicazioni supporteranno solo la locale "en" e non avranno bisogno di capacità di traduzione o php-intl. Se sei tu, o non puoi installare php-intl sul tuo server, puoi aggiungere esplicitamente symfony / icu ~ 1.0 al tuo file composer.json. 1.0 non richiede php-intl, mentre 1.1+ lo richiede.

Se non hai bisogno di funzioni di traduzione:

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

Senza questa dichiarazione e senza provare ad installare symfony / symfony 2.3 Composer potrebbe provare ad installare symfony / icu ~ 1.2, il che richiederebbe l'installazione di php-intl.

Questo è esplicitamente trattato in modo più estensivo nella documentazione del componente Symfony Intl sotto "Problemi di ICU e distribuzione".


1
Grazie per questo. È assurdo che Symfony2 chiuda l'installazione su una caratteristica che dovrebbe essere opzionale e non è installata in molti ambienti.
Acyra

Scusa, ma non è vero. L'installazione di symfony 2.3 analizzerà la configurazione e determinerà il corretto componente icu. NON si spegnerà.
tweini

POC composer.json: "require":{"symfony/symfony": "v2.3.3"}}risultato: ´Caricamento dei repository del compositore con informazioni sul pacchetto Installazione delle dipendenze (incluso require-dev) - Installazione di psr / log (1.0.0) Download: 100% - Installazione di twig / twig (v1.13.2) Download: 100% - Installazione di doctrine / common (2.3.0) Download: 100% - Installazione di symfony / symfony (v2.3.3) Download: 100% - Installazione di symfony / icu (v1.0.0) Download: 100% Scrittura del file di blocco Generazione dei file di caricamento automatico
tweini

1
Come spiegato nei documenti, il problema sorge quando composer.lockviene condiviso tra ambienti con versioni differenti (o assenza) di Intl.
Tamlyn,

Grazie per questo! Incrociando le dita posso avviare il mio progetto Symfony2 per un cliente che è ancora su GoDaddy
Matt

15

Una soluzione a questo o simili problemi può essere trovata qui: ICU e problemi di distribuzione

Il comportamento del compositore dovrebbe essere intelligente selezionando il giusto componente icu:

  • symfony / icu 1.0. *: quando l'estensione intl non è disponibile
  • symfony / icu 1.1. *: quando intl è compilato con ICU 4.0 o superiore
  • symfony / icu 1.2. *: quando intl è compilato con ICU 4.4 o superiore

Non dovrebbero esserci (teoricamente) errori durante l'installazione di symfony 2.3. senza estensione internazionale.

Ma puoi essere intrappolato quando il tuo ambiente di sviluppo è diverso dal tuo server di produzione come menzionato in questo articolo:

  • le macchine di sviluppo sono compilate con ICU 4.4 o superiore, ma il server è compilato> con una versione ICU inferiore a 4.4
  • l'estensione intl è disponibile sulle macchine di sviluppo ma non sul server.

Quando non si dispone dell'accesso root al server di produzione, è possibile risolverlo come menzionato in questo articolo. (modificando composer.json)

Spero che queste informazioni aggiuntive siano state utili in quanto mi hanno aiutato per questo caso speciale con ambienti diversi.


9

Mac OS Mavericks viene fornito con PHP 5.4.17 senza intl. Per ottenerlo, dovrai seguire questi passaggi:

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

So che questa risposta potrebbe non essere la risposta corretta al problema di questa persona, ma era la soluzione al mio problema con lo stesso titolo. Sono stato in grado di risolvere questo problema da solo abilitando l'estensione intl in php.ini e aggiornando il compositore.

Aggiornamento del compositore.

php composer.phar self-update

Rimuovi il commento da questa riga (in php.ini):

extension=php_intl.dll

E rimuovi anche il commento queste due righe sotto [intl] in (php.ini):

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

E riavvia ovviamente apache2. :)

Informazioni aggiuntive:

Se utilizzi mac e php installato con Homebrew, segui questi passaggi:

(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

Riavvia Apache.


1
Sembra che questa sia la correzione di Windows ;-)
Mark Fox

1
Sì, sto usando Windows, tuttavia, non è una "correzione di Windows", è una correzione per la configurazione di php e l'aggiornamento del compositore. Potrebbe essere necessario eseguire gli stessi passaggi su un computer Linux o Mac.
Layton Everson

Corretta. Forse dovresti menzionare quale distribuzione php / apache stai usando allora. Nel tuo caso l'estensione intl è in bundle e deve solo essere abilitata, questa è un'ottima notizia per chiunque utilizzi lo stesso pacchetto di distribuzione.
Mark Fox

1
Buon punto Mark Fox. Qui siamo per chiunque ne abbia bisogno. Sto usando lo stack XAMPP di apachefriends su una scatola di Windows 8. (versione 1.8)
Layton Everson

1
Per me questo lo ha risolto usando XAMPP. L'estensione era già abilitata, ma ha funzionato solo dopo aver aggiunto [intl] intl.default_locale = en_utf8 intl.error_level = E_WARNING
d0001

5

Una soluzione migliore è correggere il tuo composer.json alla versione richiesta dal server di produzione. Innanzitutto, determina la versione ICU sul server: 1 2

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

Quindi aggiusta il componente Icu nel tuo file composer.json a una versione corrispondente:

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

Impostare la versione su "1.0. " Se sul server non è installata l'estensione intl; "1.1. " Se il server è compilato con ICU 4.2 o inferiore.

Infine, corri

php composer.phar update symfony/icu

sulla macchina di sviluppo, eseguire test approfonditi e distribuire nuovamente. L'installazione delle dipendenze ora avrà esito positivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.