Probleme mit der lib-icu-Abhängigkeit bei der Installation von Symfony 2.3.x über Composer

112

Ich hatte keine Probleme bei der Installation von Symfony 2.2.x mit Composer. Ich habe immer nur die stabile Version unter http://symfony.com/download kopiert .

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

(Ich habe Composer global installiert.)
Neugierig auf 2.3.0-RC1 Ich dachte, das würde reibungslos funktionieren:

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

Wurde aber durch folgende Fehler heruntergefahren:

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

Muss ich die Datei composer.json optimieren?


Lösungsupdate

Mir fehlte die PHP-Intl-Erweiterung, die bietet lib-icu bereitstellt

So einfach, installieren und konfigurieren Sie die intl-Erweiterung. Ab PHP 5.3 ist die Intl-Erweiterung standardmäßig verteilt, aber einige Distributionen, wie MAMP, haben kein Intl, sodass Sie es erwerben müssen. Ich habe PEAR benutzt :

Meine Schritte:

  • Installieren Sie die Intl-Erweiterung (von PECL verwaltet): $ pear install pecl/intl - Möglicherweise müssen Sie zuerst den Pecl-Kanal zu Pear hinzufügen.
  • Wenn Sie MAMP verwenden und noch nie mit Pear / Pecl gearbeitet haben, lesen Sie den hilfreichen Blog-Beitrag von lullabot . MAMP wird nicht mit der PHP-Quelle geliefert, daher müssen Sie die Quelle für Ihre PHP-Version herunterladen und in die Quelle verschieben /Applications/MAMP/bin/php/php[version]/include/php(wie im Blog-Beitrag beschrieben).
  • PEAR konnte meine php.ini nicht finden, daher musste ich sie manuell extension=intl.sozu php.ini hinzufügen . In MAMP können Sie die php.ini einfach bearbeiten, indem Sie zu Datei> Vorlage bearbeiten> php. [Version] .ini gehen

Befehlszeile:

  • Wenn Sie die Konsolen-CLI von Composer oder Symfony verwenden, benötigen Sie auch Intl. Da die phpCLI normalerweise eine andere verwendet php.ini, möchten Sie dort auch die Erweiterungsanweisung hinzufügen. Um die php.ini Ihrer CLI zu finden, müssen Sie lediglich $ php -i |grep php\.iniden Dateipfad ermitteln und hinzufügenextension=intl.so dieser php.ini .
  • Um zu überprüfen, ob Intl installiert ist, können Sie $ php -mdie verfügbaren Module überprüfen.
Mark Fox
quelle
Welches Betriebssystem benutzt du? dann kann ich Informationen darüber geben, wie Sie Ihre intl-Erweiterung aktualisieren können.
Nicolai Fröhlich
Verwenden Sie nicht pecl / intl, da dies aus Gründen der PHP 5.2.x-Kompatibilität erfolgt. Ab PHP 5.3 ist Intl eine Kernerweiterung.
Jérôme Vieilledent
2
@ JérômeVieilledent es scheint, dass die aktuelle MAMP-Distribution Intl nicht bündelt, was Ihnen nur die Möglichkeit lässt, PECL zu verwenden, um es zu erstellen. Php.net/manual/en/intl.installation.php
Mark Fox

Antworten:

118

aktualisiere deine php-intl erweiterung, da kommt der icu fehler her!

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

Überprüfen Sie, ob die Erweiterung auch in der php.ini aktiviert und ordnungsgemäß konfiguriert ist.

(Hinweis: php-cli verwendet manchmal eine andere php.ini)

php.ini

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

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

Überprüfen Sie Ihr phpinfo()UND php -mvon Ihrem Terminal aus, ob die Erweiterung erfolgreich aktiviert wurde.

Überprüfen Sie Ihre aktuellen intl-Versionen von PHP mit:

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

Achtung: nicht mehr benötigt ( Symfony 2.3 wurde inzwischen veröffentlicht )

Fügen Sie Ihrer Abhängigkeit das Mindeststabilitätsflag @dev oder @rc wie folgt hinzu:

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

Die Standardstabilität in Composer ist stabil, welcher Symfony 2.3-Zweig derzeit nicht vorhanden ist (es ist @rc). Lesen Sie mehr eine Stabilität Flaggen hier .

Nicolai Fröhlich
quelle
Großartiger Artikel. Die Composer-Dokumentation ließ mich weniger als sicher, was, wenn überhaupt, die Stabilitätsflagge ins Spiel kam.
Mark Fox
Ich habe php-intl über PEAR / PECL installiert. Aus irgendeinem Grund INTL::…schlägt fehl. Aber ich kann über phpinfo () im Browser sehen, dass Intl installiert ist und die ICU-Version 49.x ist. Composer schlägt jedoch immer noch mit derselben Fehlermeldung fehl.
Mark Fox
welches Betriebssystem? "sudo aptitude installiere php5-intl" zum Beispiel auf Ubuntu. Erweiterung in php.ini aktiviert, sichtbar mit php -m über die Kommandozeile?
Nicolai Fröhlich
1
Mac OSX 10.7.5 - Wenn ich laufe, php -msehe ich NICHT intl. Ich weiß, dass es auf dem Webserver funktioniert, aber es wird in der Befehlszeile nicht erkannt. Also ... muss ich es der Kommandozeile hinzufügen?
Mark Fox
Ich habe über Homebrew installiert, php -merkenne es aber immer noch nicht von der CLI?
Mark Fox
21

Viele Anwendungen unterstützen nur das Gebietsschema "en" und benötigen keine Übersetzungsfunktionen oder PHP-Intl. Wenn Sie es sind oder Sie php-intl nicht auf Ihrem Server installieren können, können Sie symfony / icu ~ 1.0 explizit zu Ihrem Server hinzufügen composer.json. 1.0 erfordert kein php-intl, während 1.1+ dies tut.

Wenn Sie keine Übersetzungsfunktionen benötigen:

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

Ohne diese Deklaration und den Versuch, symfony / symfony 2.3 zu installieren, versucht Composer möglicherweise, symfony / icu ~ 1.2 zu installieren, was die Installation von php-intl erfordern würde.

Dies wird in den Dokumenten der Symfony Intl-Komponente unter "Probleme mit der Intensivstation und der Bereitstellung" explizit ausführlicher behandelt .

John Kary
quelle
1
Danke dafür. Es ist absurd, dass Symfony2 die Installation über eine Funktion herunterfährt, die optional sein sollte und in vielen Umgebungen nicht installiert wird.
Acyra
Entschuldigung, aber das stimmt nicht. Durch die Installation von symfony 2.3 wird die Konfiguration überprüft und die richtige icu-Komponente ermittelt. Es wird NICHT heruntergefahren.
Tweini
POC composer.json: "require":{"symfony/symfony": "v2.3.3"}}Ergebnis: ´Laden von Composer-Repositorys mit Paketinformationen Installieren von Abhängigkeiten (einschließlich require-dev) - Installieren von psr / log (1.0.0) Herunterladen: 100% - Installieren von twig / twig (v1.13.2) Herunterladen: 100% - Installieren von Doctrine / Common (2.3.0) Herunterladen: 100% - Installieren von Symfony / Symfony (v2.3.3) Herunterladen: 100% - Installieren von Symfony / icu (v1.0.0) Herunterladen: 100% Schreiben einer Sperrdatei Generieren von Autoload-Dateien
tweini
1
Wie in den Dokumenten erläutert, tritt das Problem auf, wenn composer.lockUmgebungen mit unterschiedlichen Versionen (oder Abwesenheit) von Intl gemeinsam genutzt werden.
Tamlyn
Danke dafür! Ich drücke die Daumen und kann mein Symfony2-Projekt für einen Kunden zum Laufen bringen, der noch auf GoDaddy ist
Matt
15

Eine Lösung für dieses oder ähnliche Probleme finden Sie hier: Probleme auf der Intensivstation und bei der Bereitstellung

Das Verhalten des Komponisten sollte intelligent sein und die richtige ICU-Komponente auswählen:

  • symfony / icu 1.0. *: Wenn die intl-Erweiterung nicht verfügbar ist
  • symfony / icu 1.1. *: Wenn intl mit ICU 4.0 oder höher kompiliert wird
  • symfony / icu 1.2. *: Wenn intl mit ICU 4.4 oder höher kompiliert wird

Bei der Installation von Symfony 2.3 sollte (theoretisch) kein Fehler auftreten. ohne intl-erweiterung.

Sie können jedoch gefangen sein, wenn sich Ihre Entwicklungsumgebung von Ihrem Produktionsserver unterscheidet, wie in diesem Artikel erwähnt:

  • Die Entwicklungsmaschinen werden mit ICU 4.4 oder höher kompiliert, aber der Server wird> mit einer niedrigeren ICU-Version als 4.4 kompiliert
  • Die intl-Erweiterung ist auf den Entwicklungsmaschinen verfügbar, jedoch nicht auf dem Server.

Wenn Sie keinen Root-Zugriff auf Ihren Produktionsserver haben, können Sie diesen wie in diesem Artikel beschrieben beheben. (optimiert composer.json)

Hoffe, diese zusätzlichen Informationen haben geholfen, da sie mir für diesen speziellen Fall in verschiedenen Umgebungen geholfen haben.

tweini
quelle
9

Mac OS Mavericks wird mit PHP 5.4.17 ohne intl geliefert. Um dies zu erhalten, müssen Sie die folgenden Schritte ausführen:

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

Ich weiß, dass diese Antwort möglicherweise nicht die richtige Antwort auf das Problem dieser Person ist, aber es war die Lösung für mein Problem mit demselben Titel. Ich konnte dieses Problem selbst beheben, indem ich die intl-Erweiterung in php.ini aktivierte und den Composer aktualisierte.

Komponist aktualisieren.

php composer.phar self-update

Kommentar aus dieser Zeile entfernen (in php.ini):

extension=php_intl.dll

Und entfernen Sie auch den Kommentar zu diesen beiden Zeilen unter [intl] in (php.ini):

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

Und starten Sie apache2 natürlich neu. :) :)

Zusätzliche Information:

Wenn Sie einen Mac verwenden und PHP mit Homebrew installiert haben, gehen Sie folgendermaßen vor:

(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

Starten Sie Apache neu.

Layton Everson
quelle
1
Sieht so aus, als wäre dies das Windows-Update ;-)
Mark Fox
1
Ja, ich verwende Windows, es ist jedoch kein "Windows-Fix", sondern ein PHP-Konfigurations- und Composer-Update-Fix. Dieselben Schritte müssen möglicherweise auf einer Linux- oder Mac-Box ausgeführt werden.
Layton Everson
Richtig. Vielleicht sollten Sie erwähnen, welche PHP / Apache-Distribution Sie dann verwenden. In Ihrem Fall ist die intl-Erweiterung gebündelt und muss nur aktiviert werden. Das sind großartige Neuigkeiten für alle, die dasselbe Distributionspaket verwenden.
Mark Fox
1
Guter Punkt Mark Fox. Hier sind wir für alle, die es brauchen. Ich verwende den XAMPP-Stack von Apachefriends auf einer Windows 8-Box. (Version 1.8)
Layton Everson
1
Für mich wurde dies mit XAMPP behoben. Die Erweiterung war bereits aktiviert, funktionierte jedoch erst nach dem Hinzufügen von [intl] intl.default_locale = en_utf8 intl.error_level = E_WARNING
d0001
5

Eine bessere Lösung besteht darin, Ihre composer.json auf die vom Produktionsserver benötigte Version zu korrigieren. Ermitteln Sie zunächst die ICU-Version auf dem Server: 1 2

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

Korrigieren Sie dann die Icu-Komponente in Ihrer composer.json-Datei auf eine passende Version:

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

Setzen Sie die Version auf "1.0 ", wenn auf dem Server die intl-Erweiterung nicht installiert ist. 1.1. ", Wenn der Server mit ICU 4.2 oder niedriger kompiliert ist.

Zum Schluss laufen

php composer.phar update symfony/icu

Testen Sie auf Ihrem Entwicklungscomputer ausführlich und stellen Sie es erneut bereit. Die Installation der Abhängigkeiten ist nun erfolgreich.

thewbb
quelle