Problemy z zależnością lib-icu podczas instalacji Symfony 2.3.x przez Composer

112

Nie miałem problemów z instalacją Symfony 2.2.x przy użyciu Composera, zawsze kopiowałem stabilną wersję ze strony http://symfony.com/download .

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

(Mam zainstalowanego Composera na całym świecie)
Zaciekawiony 2.3.0-RC1 Pomyślałem, że wszystko pójdzie gładko:

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

Ale został zamknięty przez następujące błędy:

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

Czy muszę poprawić plik composer.json?


Aktualizacja rozwiązania

Brakowało mi rozszerzenia php intl, które zapewnia lib-icu

Tak łatwo, zainstaluj i skonfiguruj rozszerzenie intl. Od PHP 5.3 rozszerzenie Intl jest dystrybuowane domyślnie, ale niektóre dystrybucje, takie jak MAMP, nie mają Intl, więc musisz je zdobyć. Użyłem PEAR :

Moje kroki:

  • Zainstaluj rozszerzenie Intl (obsługiwane przez PECL): $ pear install pecl/intl- być może będziesz musiał najpierw dodać kanał pecl do pear.
  • Jeśli używasz MAMP i nigdy nie pracowałeś z gruszką / peclem, sprawdź pomocny post na blogu lullabot ; MAMP nie jest dostarczany ze źródłem php, więc musisz pobrać źródło swojej wersji php i przenieść je do /Applications/MAMP/bin/php/php[version]/include/php(jak opisano w poście na blogu)
  • PEAR nie mógł znaleźć mojego php.ini, więc musiałem ręcznie dodać extension=intl.sodo php.ini. W MAMP możesz łatwo edytować php.ini, przechodząc do Plik> Edytuj szablon> php. [Wersja] .ini

Wiersz poleceń:

  • Podczas korzystania z Composera lub Konsoli CLI Symfony będziesz również potrzebował Intl, a ponieważ phpCLI zwykle używa innego php.ini, będziesz chciał dodać tam również dyrektywę rozszerzenia. Aby znaleźć php.ini swojego CLI, po prostu zrób, $ php -i |grep php\.iniaby znaleźć ścieżkę pliku i dodać również extension=intl.sodo tego php.ini.
  • Aby sprawdzić, czy Intl jest zainstalowany, możesz $ php -msprawdzić dostępne moduły.
Mark Fox
źródło
którego systemu operacyjnego używasz? wtedy mogę udzielić informacji, jak zaktualizować rozszerzenie intl.
Nicolai Fröhlich
Nie używaj pecl / intl, ponieważ jest to zgodne z PHP 5.2.x. Od PHP 5.3 Intl jest podstawowym rozszerzeniem.
Jérôme Vieilledent
2
@ JérômeVieilledent, wygląda na to, że obecna dystrybucja MAMP nie obejmuje Intl, co pozostawia tylko opcję użycia PECL do jego zbudowania php.net/manual/en/intl.installation.php
Mark Fox

Odpowiedzi:

118

zaktualizuj rozszerzenie php-intl , stąd pochodzi błąd icu!

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

sprawdź, czy rozszerzenie jest włączone i poprawnie skonfigurowane w php.ini.

(wskazówka: php-cli czasami używa innego php.ini)

php.ini

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

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

sprawdź swoje phpinfo()AND php -mna swoim terminalu, jeśli rozszerzenie zostało pomyślnie włączone.

Sprawdź swoje aktualne wersje intl z php za pomocą:

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

uwaga: już nie jest potrzebne ( symfony 2.3 zostało w międzyczasie wydane )

dodaj flagę minimalnej stabilności @dev lub @rc do swojej zależności w ten sposób:

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

Domyślna stabilność w composer jest stabilna, której gałąź symfony 2.3 nie jest obecnie (jest to @rc). Przeczytaj więcej i flagi stabilności tutaj .

Nicolai Fröhlich
źródło
Świetny artykuł. Dokumentacja Composera pozostawiła mnie mniej niż pewności, czy w ogóle pojawi się flaga stabilności.
Mark Fox,
Zainstalowałem php-intl przez PEAR / PECL. Z jakiegoś powodu INTL::…zawodzi. Ale widzę przez phpinfo () w przeglądarce, że Intl jest zainstalowany, a wersja ICU to 49.x. Jednak Composer nadal kończy się niepowodzeniem i wyświetla ten sam komunikat o błędzie.
Mark Fox
jaki system operacyjny? Na przykład „sudo aptitude install php5-intl” na systemie ubuntu. rozszerzenie włączone w php.ini, widoczne z php -m z linii poleceń?
Nicolai Fröhlich
1
Mac OSX 10.7.5 - kiedy uruchamiam php -m, NIE widzę intl. Wiem, że działa na serwerze internetowym, ale nie jest rozpoznawany w wierszu poleceń. Więc… muszę dodać to do wiersza poleceń?
Mark Fox
Zainstalowałem przez Homebrew, ale php -mnadal nie rozpoznajesz z CLI?
Mark Fox
21

Wiele aplikacji będzie obsługiwać tylko język „en” i nie będzie potrzebować funkcji tłumaczenia ani php-intl. Jeśli to ty, lub nie możesz zainstalować php-intl na swoim serwerze, możesz jawnie dodać symfony / icu ~ 1.0 do swojego composer.json. 1.0 nie wymaga php-intl, podczas gdy 1.1+ tak.

Jeśli nie potrzebujesz funkcji tłumaczenia:

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

Bez tej deklaracji i próbując zainstalować symfony / symfony 2.3 Composer może próbować zainstalować symfony / icu ~ 1.2, co wymagałoby zainstalowania php-intl.

Jest to dokładniej omówione w dokumentacji komponentu Symfony Intl w części „ICU and Deployment Problems”.

John Kary
źródło
1
Dzięki za to. To absurd, że Symfony2 wyłącza instalację z powodu funkcji, która powinna być opcjonalna i nie jest instalowana w wielu środowiskach.
Acyra
Przepraszamy, ale to nieprawda. Instalacja symfony 2.3 przeprowadzi introspekcję konfiguracji i określi prawidłowy komponent icu. NIE wyłączy się.
tweini
POC composer.json: "require":{"symfony/symfony": "v2.3.3"}}wynik: ´ Ładowanie repozytoriów kompozytora z informacjami o pakiecie Instalowanie zależności (w tym require-dev) - Instalowanie psr / log (1.0.0) Pobieranie: 100% - Instalowanie twig / twig (v1.13.2) Pobieranie: 100% - Instalowanie doctrine / common (2.3.0) Pobieranie: 100% - Instalowanie symfony / symfony (v2.3.3) Pobieranie: 100% - Instalowanie symfony / icu (v1.0.0) Pobieranie: 100% Zapisywanie pliku blokującego Generowanie automatycznie
ładowanych
1
Jak wyjaśniono w dokumentacji, problem pojawia się, gdy composer.lockjest współdzielony między środowiskami z różnymi wersjami (lub brakiem) Intl.
Tamlyn
Dzięki za to! Trzymając kciuki, mogę uruchomić mój projekt Symfony2 dla klienta, który nadal jest na GoDaddy
Matt
15

Rozwiązanie tego lub podobnych problemów można znaleźć tutaj: ICU and Deployment Problems

Zachowanie kompozytora powinno być inteligentne, wybierając odpowiedni komponent icu:

  • symfony / icu 1.0. *: gdy rozszerzenie intl nie jest dostępne
  • symfony / icu 1.1. *: gdy intl jest skompilowany z ICU 4.0 lub nowszym
  • symfony / icu 1.2. *: gdy intl jest skompilowany z ICU 4.4 lub nowszym

Podczas instalacji symfony 2.3 nie powinno być (teoretycznie) żadnego błędu. bez rozszerzenia intl.

Ale możesz zostać uwięziony, gdy twoje środowisko programistyczne różni się od twojego serwera produkcyjnego, jak wspomniano w tym artykule:

  • maszyny programistyczne są skompilowane z ICU 4.4 lub nowszym, ale serwer jest skompilowany> z niższą wersją ICU niż 4.4
  • rozszerzenie intl jest dostępne na maszynach deweloperskich, ale nie na serwerze.

Jeśli nie masz uprawnień administratora do serwera produkcyjnego, możesz to naprawić, jak wspomniano w tym artykule. (poprawianie pliku composer.json)

Mam nadzieję, że te dodatkowe informacje pomogły mi w tym szczególnym przypadku w różnych środowiskach.

tweini
źródło
9

Mac OS Mavericks zawiera PHP 5.4.17 bez intl. Aby to uzyskać, musisz wykonać następujące kroki:

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
źródło
6

Wiem, że ta odpowiedź może nie być poprawną odpowiedzią na problem tej osoby, ale była rozwiązaniem mojego problemu o tym samym tytule. Udało mi się rozwiązać ten problem samodzielnie, włączając rozszerzenie intl w php.ini i aktualizując program Composer.

Uaktualnianie kompozytora.

php composer.phar self-update

Usuń komentarz z tej linii (w php.ini):

extension=php_intl.dll

A także usuń komentarz te dwie linie poniżej [intl] w (php.ini):

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

I oczywiście zrestartuj Apache2. :)

Dodatkowe informacje:

Jeśli używasz komputera Mac i zainstalowano php z Homebrew, wykonaj następujące kroki:

(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

Zrestartuj Apache.

Layton Everson
źródło
1
Wygląda na to, że to poprawka systemu Windows ;-)
Mark Fox
1
Tak, używam systemu Windows, jednak nie jest to „poprawka systemu Windows”, to naprawa konfiguracji php i kompozytora. Te same kroki mogą wymagać podjęcia na komputerze z systemem Linux lub Mac.
Layton Everson
Poprawny. Być może powinieneś wspomnieć, której dystrybucji php / apache używasz wtedy. W twoim przypadku rozszerzenie intl jest dołączone i musi być tylko włączone, to świetna wiadomość dla każdego, kto używa tego samego pakietu dystrybucji.
Mark Fox
1
Słuszna uwaga Mark Fox. Tutaj jesteśmy dla każdego, kto tego potrzebuje. Używam stosu XAMPP od apachefriends na pudełku z systemem Windows 8. (wersja 1.8)
Layton Everson
1
Dla mnie to naprawiło to za pomocą XAMPP. Rozszerzenie było już włączone, ale działało dopiero po dodaniu [intl] intl.default_locale = en_utf8 intl.error_level = E_WARNING
d0001
5

Lepszym rozwiązaniem jest poprawienie pliku composer.json w wersji wymaganej przez serwer produkcyjny. Najpierw określ wersję ICU na serwerze: 1 2

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

Następnie napraw komponent Icu w pliku composer.json do pasującej wersji:

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

Ustaw wersję na „1.0. ”, Jeśli serwer nie ma zainstalowanego rozszerzenia intl; „1.1. ”, Jeśli serwer jest skompilowany z wersją ICU 4.2 lub starszą.

Wreszcie biegnij

php composer.phar update symfony/icu

na komputerze deweloperskim, przetestuj go i ponownie wdróż. Instalacja zależności zakończy się teraz sukcesem.

thewbb
źródło