Problèmes de dépendance lib-icu lors de l'installation de Symfony 2.3.x via Composer

112

Je n'ai eu aucun problème pour installer Symfony 2.2.x en utilisant Composer, j'ai toujours copié la version stable à http://symfony.com/download .

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

(J'ai installé Composer dans le monde entier)
Curieux de savoir 2.3.0-RC1, j'ai pensé que cela se passerait bien:

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

Mais j'ai été arrêté par les erreurs suivantes:

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

Dois-je modifier le fichier composer.json?


Mise à jour de la solution

Il me manquait l' extension php intl qui fournit lib-icu

Tellement facile, installez et configurez l'extension intl. Depuis PHP 5.3, l'extension Intl est distribuée par défaut, mais certaines distributions, comme MAMP, n'ont pas Intl, vous devrez donc l'acquérir. J'ai utilisé PEAR :

Mes pas:

  • Installez l'extension Intl (maintenue par PECL): $ pear install pecl/intl - vous devrez peut-être ajouter le canal pecl à pear en premier.
  • Si vous utilisez MAMP et n'avez jamais travaillé avec pear / pecl, consultez le blog utile de Lullabot ; MAMP n'est pas livré avec la source php, vous devez donc télécharger la source de votre version php et déplacer la source dans/Applications/MAMP/bin/php/php[version]/include/php (comme indiqué dans l'article du blog)
  • PEAR n'a pas pu trouver mon php.ini, j'ai donc dû l'ajouter manuellement extension=intl.soà php.ini. Dans MAMP, vous pouvez facilement modifier php.ini en allant dans Fichier> Modifier le modèle> php. [Version] .ini

Ligne de commande:

  • Lorsque vous utilisez Composer ou la console CLI de Symfony, vous aurez également besoin d'Intl et comme la phpCLI utilise généralement un autre, php.inivous voudrez également y ajouter la directive d'extension. Pour trouver le php.ini de votre CLI, il vous suffit $ php -i |grep php\.inide découvrir le chemin du fichier et d'ajouter également extension=intl.soà ce php.ini.
  • Pour vérifier si Intl est installé, vous pouvez $ php -mvérifier les modules disponibles.
Mark Fox
la source
quel os utilisez-vous? alors je peux fournir des informations sur la façon de mettre à jour votre extension intl.
Nicolai Fröhlich
N'utilisez pas pecl / intl car c'est pour la compatibilité PHP 5.2.x. Depuis PHP 5.3, Intl est une extension principale.
Jérôme Vieilledent
2
@ JérômeVieilledent il semble que la distribution actuelle de MAMP ne regroupe pas Intl, ce qui ne vous laisse que la possibilité d'utiliser PECL pour le construire php.net/manual/en/intl.installation.php
Mark Fox

Réponses:

118

mettez à jour votre extension php-intl , c'est de là que vient l'erreur icu!

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

vérifiez que l'extension est activée et correctement configurée dans php.ini également.

(indice: php-cli utilise parfois un autre php.ini)

php.ini

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

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

vérifiez votre phpinfo()ET php -mdepuis votre terminal si l'extension a été activée avec succès.

Vérifiez vos versions intl actuelles de php avec:

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

attention: plus nécessaire ( symfony 2.3 est entre-temps sorti )

ajoutez l'indicateur de stabilité minimum @dev ou @rc à votre dépendance comme ceci s'il vous plaît:

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

La stabilité par défaut dans composer est stable, ce que la branche symfony 2.3 n'est pas actuellement (c'est @rc). En savoir plus sur les drapeaux de stabilité ici .

Nicolai Fröhlich
la source
Excellent article. La documentation de Composer m'a laissé moins que certain de ce que l'indicateur de stabilité entrait en jeu.
Mark Fox
J'ai installé php-intl via PEAR / PECL. Pour une raison quelconque, INTL::…échoue. Mais, je peux voir via phpinfo () dans le navigateur qu'Intl est installé et que la version ICU est 49.x. Cependant, Composer échoue toujours avec le même message d'erreur.
Mark Fox
quel système d'exploitation? "sudo aptitude install php5-intl" sur ubuntu par exemple. extension activée dans php.ini, visible avec php -m depuis la ligne de commande?
Nicolai Fröhlich
1
Mac OSX 10.7.5 - lorsque je lance, php -mje ne vois PAS intl. Je sais que cela fonctionne sur le serveur Web, mais ce n'est pas reconnu sur la ligne de commande. Alors… je dois l'ajouter à la ligne de commande?
Mark Fox
J'ai installé via Homebrew, mais php -mne reconnaît toujours pas de CLI?
Mark Fox
21

De nombreuses applications ne prendront en charge que la locale "en" et n'auront pas besoin de capacités de traduction ou de php-intl. Si c'est vous, ou si vous ne pouvez pas installer php-intl sur votre serveur, vous pouvez ajouter explicitement symfony / icu ~ 1.0 à votre composer.json. 1.0 ne nécessite pas php-intl, contrairement à 1.1+.

Si vous n'avez pas besoin de fonctionnalités de traduction:

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

Sans cette déclaration et en essayant d'installer symfony / symfony 2.3 Composer peut essayer d'installer symfony / icu ~ 1.2, ce qui vous obligerait à installer php-intl.

Ceci est explicitement couvert plus en détail dans la documentation du composant Symfony Intl sous «ICU and Deployment Problems».

John Kary
la source
1
Merci pour cela. Il est absurde que Symfony2 arrête l'installation sur une fonctionnalité qui devrait être facultative et qui n'est pas installée dans de nombreux environnements.
Acyra
Désolé, mais ce n'est pas vrai. L'installation de symfony 2.3 introspectera la configuration et déterminera le composant icu correct. Il ne s'arrêtera PAS.
tweini
POC composer.json: "require":{"symfony/symfony": "v2.3.3"}}résultat: ´Chargement des référentiels de compositeur avec les informations sur les paquets Installation des dépendances (y compris require-dev) - Installation de psr / log (1.0.0) Téléchargement: 100% - Installation de twig / twig (v1.13.2) Téléchargement: 100% - Installation de doctrine / common (2.3.0) Téléchargement: 100% - Installation de symfony / symfony (v2.3.3) Téléchargement: 100% - Installation de symfony / icu (v1.0.0) Téléchargement: 100% Écriture du fichier de verrouillage Génération de fichiers de chargement automatique
tweini
1
Comme expliqué dans la documentation, le problème survient lorsqu'il composer.lockest partagé entre des environnements avec différentes versions (ou absence) d'Intl.
Tamlyn
Merci pour cela! En croisant les doigts, je peux lancer mon projet Symfony2 pour un client qui est toujours sur GoDaddy
Matt
15

Une solution à ce problème ou à des problèmes similaires peut être trouvée ici: ICU et problèmes de déploiement

Le comportement du compositeur doit être intelligent en sélectionnant le bon composant icu:

  • symfony / icu 1.0. *: lorsque l'extension intl n'est pas disponible
  • symfony / icu 1.1. *: lorsque intl est compilé avec ICU 4.0 ou supérieur
  • symfony / icu 1.2. *: lorsque intl est compilé avec ICU 4.4 ou supérieur

Il ne devrait y avoir (théoriquement) aucune erreur lors de l'installation de symfony 2.3. sans extension intl.

Mais vous pouvez être piégé lorsque votre environnement de développement diffère de votre serveur de production comme mentionné dans cet article:

  • les machines de développement sont compilées avec ICU 4.4 ou supérieur, mais le serveur est compilé> avec une version ICU inférieure à 4.4
  • l'extension intl est disponible sur les machines de développement mais pas sur le serveur.

Lorsque vous n'avez pas d'accès root à votre serveur de production, vous pouvez le réparer comme mentionné dans cet article. (peaufiner composer.json)

J'espère que ces informations supplémentaires m'ont aidé car elles m'ont aidé pour ce cas particulier avec différents environnements.

tweini
la source
9

Mac OS Mavericks est livré avec PHP 5.4.17 sans intl. Pour l'obtenir, vous devrez suivre ces étapes:

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
la source
6

Je sais que cette réponse n'est peut-être pas la bonne réponse au problème de cette personne, mais c'était la solution à mon problème avec le même titre. J'ai pu résoudre ce problème moi-même en activant l'extension intl dans php.ini et en mettant à jour le compositeur.

Mise à niveau du compositeur.

php composer.phar self-update

Supprimer le commentaire de cette ligne (dans php.ini):

extension=php_intl.dll

Et supprimez également le commentaire de ces deux lignes ci-dessous [intl] dans (php.ini):

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

Et redémarrez apache2 bien sûr. :)

Information additionnelle:

Si vous utilisez mac et installé php avec Homebrew, procédez comme suit:

(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

Redémarrez apache.

Layton Everson
la source
1
On dirait que c'est le correctif Windows ;-)
Mark Fox
1
Oui, j'utilise Windows, cependant, ce n'est pas un «correctif de Windows», c'est un correctif de mise à jour de la configuration php et du compositeur. Les mêmes étapes peuvent être nécessaires sur une machine Linux ou Mac.
Layton Everson
Correct. Vous devriez peut-être mentionner la distribution php / apache que vous utilisez alors. Dans votre cas, l'extension intl est fournie et doit simplement être activée, c'est une excellente nouvelle pour tous ceux qui utilisent le même package de distribution.
Mark Fox
1
Bon point Mark Fox. Nous sommes ici pour quiconque en a besoin. J'utilise la pile XAMPP d'apachefriends sur une boîte Windows 8. (version 1.8)
Layton Everson
1
Pour moi, cela l'a corrigé en utilisant XAMPP. L'extension était déjà activée, mais elle ne fonctionnait qu'après l'ajout de [intl] intl.default_locale = en_utf8 intl.error_level = E_WARNING
d0001
5

Une meilleure solution consiste à fixer votre composer.json à la version requise par le serveur de production. Tout d'abord, déterminez la version ICU sur le serveur: 1 2

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

Ensuite, corrigez le composant Icu de votre fichier composer.json sur une version correspondante:

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

Définissez la version sur "1.0 " si le serveur n'a pas l'extension intl installée; "1.1. " Si le serveur est compilé avec ICU 4.2 ou une version antérieure.

Enfin, exécutez

php composer.phar update symfony/icu

sur votre machine de développement, testez de manière approfondie et déployez à nouveau. L'installation des dépendances va maintenant réussir.

thewbb
la source