Masalah dengan ketergantungan lib-icu saat menginstal Symfony 2.3.x melalui Composer


112

Saya tidak mengalami masalah dalam menginstal Symfony 2.2.x menggunakan Komposer, saya selalu menyalin versi stabil di http://symfony.com/download .

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

(Saya telah menginstal Komposer secara global)
Penasaran tentang 2.3.0-RC1 Saya pikir ini akan berjalan lancar:

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

Tetapi dimatikan karena kesalahan berikut:

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

Apakah saya perlu mengubah file composer.json?


Pembaruan Solusi

Saya kehilangan ekstensi intl php yang menyediakan lib-icu

Sangat mudah, instal dan konfigurasi ekstensi intl. Mulai PHP 5.3, ekstensi Intl didistribusikan secara default, tetapi beberapa distribusi, seperti MAMP, tidak memiliki Intl sehingga Anda harus mendapatkannya. Saya menggunakan PEAR :

Langkah saya:

  • Instal ekstensi Intl (dikelola oleh PECL): $ pear install pecl/intl- Anda mungkin harus menambahkan saluran pecl ke pir terlebih dahulu.
  • Jika Anda menggunakan MAMP dan belum pernah bekerja dengan pear / pecl check lullabot's membantu entri blog ; MAMP tidak dikirimkan dengan sumber php, jadi Anda harus mengunduh sumber untuk versi php Anda dan memindahkan sumber ke /Applications/MAMP/bin/php/php[version]/include/php(seperti yang tercakup dalam posting blog)
  • PEAR tidak dapat menemukan php.ini saya, jadi saya harus menambahkan extension=intl.soke php.ini secara manual . Di MAMP Anda dapat mengedit php.ini dengan mudah dengan masuk ke File> Edit Template> php. [Versi] .ini

Garis komando:

  • Saat menggunakan Composer atau Symfony's Console CLI, Anda juga memerlukan Intl dan karena phpCLI biasanya menggunakan yang berbeda, php.iniAnda juga ingin menambahkan arahan ekstensi di sana. Untuk menemukan php.ini CLI Anda cukup lakukan $ php -i |grep php\.iniuntuk menemukan path file dan tambahkan extension=intl.soke php.ini itu juga.
  • Untuk memeriksa apakah Intl terinstal, Anda dapat melakukan $ php -muntuk memeriksa modul yang tersedia.

os mana yang kamu gunakan? maka saya dapat memberikan informasi tentang cara memperbarui ekstensi intl Anda.
Nicolai Fröhlich

Jangan gunakan pecl / intl karena ini untuk kompatibilitas PHP 5.2.x. Mulai dari PHP 5.3, Intl adalah ekstensi inti.
Jérôme Vieilledent

2
@ JérômeVieilledent tampaknya distribusi MAMP saat ini tidak menggabungkan Intl yang hanya memberi Anda opsi untuk menggunakan PECL untuk membuatnya php.net/manual/en/intl.installation.php
Mark Fox

Jawaban:


118

perbarui ekstensi php-intl Anda , dari sanalah kesalahan icu berasal!

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

periksa ekstensi diaktifkan dan dikonfigurasi dengan benar di php.ini juga.

(petunjuk: php-cli terkadang menggunakan php.ini yang berbeda)

php.ini

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

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

periksa phpinfo()DAN Anda php -mdari terminal Anda jika ekstensi telah berhasil diaktifkan.

Periksa versi intl Anda saat ini dari php dengan:

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

perhatian: tidak diperlukan lagi ( sementara itu symfony 2.3 telah dirilis )

tambahkan bendera stabilitas minimum @dev atau @rc ke dependensi Anda seperti ini:

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

Stabilitas default dalam komposer adalah stabil dimana cabang symfony 2.3 saat ini tidak (@rc). Baca lebih lanjut tentang bendera stabilitas di sini .


Artikel bagus. Dokumentasi Komposer membuat saya kurang yakin bagaimana jika ada bendera stabilitas yang ikut bermain.
Mark Fox

Saya menginstal php-intl melalui PEAR / PECL. Untuk beberapa alasan INTL::…gagal. Tapi, saya bisa melihat melalui phpinfo () di browser bahwa Intl diinstal dan versi ICU adalah 49.x. Namun, Komposer masih gagal dengan pesan kesalahan yang sama.
Mark Fox

sistem operasi yang mana? "sudo aptitude install php5-intl" di ubuntu misalnya. ekstensi diaktifkan di php.ini, terlihat dengan php -m dari commandline?
Nicolai Fröhlich

1
Mac OSX 10.7.5 - ketika saya menjalankan php -msaya TIDAK melihat intl. Saya tahu ini berfungsi di server web, tetapi tidak dikenali di Command Line. Jadi… saya harus menambahkannya ke Command Line?
Mark Fox

Saya menginstal melalui Homebrew, tetapi php -mmasih tidak mengenali dari CLI?
Mark Fox

21

Banyak aplikasi hanya akan mendukung lokal "en" dan tidak memerlukan kemampuan terjemahan atau php-intl. Jika ini adalah Anda, atau Anda tidak dapat menginstal php-intl di server Anda, Anda dapat secara eksplisit menambahkan symfony / icu ~ 1.0 ke filecomposer.json . 1.0 tidak membutuhkan php-intl, sedangkan 1.1+ membutuhkan.

Jika Anda tidak membutuhkan fitur terjemahan:

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

Tanpa deklarasi ini dan mencoba menginstal symfony / symfony 2.3 Komposer dapat mencoba menginstal symfony / icu ~ 1.2 yang akan meminta Anda menginstal php-intl.

Hal ini secara eksplisit dibahas secara lebih luas dalam dokumen Symfony Intl Component di bawah "Masalah ICU dan Penerapan".


1
Terima kasih untuk ini. Tidak masuk akal jika Symfony2 menutup instalasi melalui fitur yang seharusnya opsional dan tidak diinstal di banyak lingkungan.
Acyra

Maaf, tapi itu tidak benar. Instalasi symfony 2.3 akan mengintrospeksi konfigurasi dan menentukan komponen icu yang benar. Ini TIDAK akan ditutup.
tweini

POC composer.json: "require":{"symfony/symfony": "v2.3.3"}}hasil: ´Memuat repositori composer dengan informasi paket Menginstal dependensi (termasuk require-dev) - Menginstal psr / log (1.0.0) Mengunduh: 100% - Menginstal twig / twig (v1.13.2) Mengunduh: 100% - Menginstal doktrin / umum (2.3.0) Mengunduh: 100% - Menginstal symfony / symfony (v2.3.3) Mengunduh: 100% - Menginstal symfony / icu (v1.0.0) Mengunduh: 100% Menulis file kunci
Membuat

1
Seperti yang dijelaskan dalam dokumen, masalah muncul saat composer.lockdibagi antara lingkungan dengan versi berbeda (atau tidak adanya) Intl.
Tamlyn

Terima kasih untuk ini! Berharap saya bisa menjalankan proyek Symfony2 saya untuk klien yang masih menggunakan GoDaddy
Matt

15

Solusi terkait masalah ini atau yang serupa dapat ditemukan di sini: Masalah ICU dan Penerapan

Perilaku komposer harus cerdas dalam memilih komponen icu yang tepat:

  • symfony / icu 1.0. *: ketika ekstensi intl tidak tersedia
  • symfony / icu 1.1. *: ketika intl dikompilasi dengan ICU 4.0 atau lebih tinggi
  • symfony / icu 1.2. *: ketika intl dikompilasi dengan ICU 4.4 atau lebih tinggi

Seharusnya (secara teoritis) tidak ada kesalahan saat menginstal symfony 2.3. tanpa ekstensi intl.

Tapi Anda bisa terjebak ketika lingkungan pengembangan Anda berbeda dari server produksi Anda seperti yang disebutkan dalam artikel ini:

  • mesin pengembangan dikompilasi dengan ICU 4.4 atau lebih tinggi, tetapi server dikompilasi> dengan versi ICU yang lebih rendah dari 4.4
  • ekstensi intl tersedia di mesin pengembangan tetapi tidak di server.

Ketika Anda tidak memiliki akses root ke server produksi Anda, Anda dapat memperbaikinya seperti yang disebutkan dalam artikel ini. (mengubah composer.json)

Semoga informasi tambahan ini membantu karena membantu saya untuk kasus khusus ini dengan lingkungan yang berbeda.


9

Mac OS Mavericks hadir dengan PHP 5.4.17 tanpa intl. Untuk mendapatkan ini, Anda harus mengikuti langkah-langkah berikut:

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

Saya tahu bahwa jawaban ini mungkin bukan jawaban yang benar untuk masalah orang ini, tetapi itu adalah solusi untuk masalah saya dengan judul yang sama. Saya dapat memperbaiki masalah ini untuk diri saya sendiri dengan mengaktifkan ekstensi intl di php.ini dan mengupgrade komposer.

Pengupgrade komposer.

php composer.phar self-update

Hapus komentar dari baris ini (di php.ini):

extension=php_intl.dll

Dan juga hapus komentar dua baris di bawah ini [intl] di (php.ini):

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

Dan tentu saja, restart apache2. :)

Informasi tambahan:

Jika Anda menggunakan mac dan menginstal php dengan Homebrew ikuti langkah-langkah berikut:

(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

Mulai ulang apache.


1
Sepertinya ini adalah perbaikan Windows ;-)
Mark Fox

1
Ya, saya menggunakan windows, namun, ini bukan "perbaikan windows" ini adalah konfigurasi php dan perbaikan pembaruan komposer. Langkah yang sama mungkin perlu dilakukan di linux atau mac box.
Layton Everson

Benar. Mungkin Anda harus menyebutkan distribusi php / apache yang Anda gunakan saat itu. Dalam kasus Anda, ekstensi intl dibundel dan hanya perlu diaktifkan, itu berita bagus bagi siapa saja yang menggunakan paket distro yang sama.
Mark Fox

1
Poin bagus Mark Fox. Di sini kami untuk siapa saja yang membutuhkannya. Saya menggunakan tumpukan XAMPP dari apachefriends di kotak windows 8. (versi 1.8)
Layton Everson

1
Bagi saya ini memperbaikinya menggunakan XAMPP. Ekstensi ini telah diaktifkan, tetapi hanya berfungsi setelah menambahkan [intl] intl.default_locale = en_utf8 intl.error_level =
E_WARNING

5

Solusi yang lebih baik adalah memperbaiki composer.json Anda ke versi yang diperlukan oleh server produksi. Pertama, tentukan versi ICU di server: 1 2

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

Kemudian perbaiki komponen Icu di file composer.json Anda ke versi yang cocok:

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

Setel versi ke "1.0 " jika server tidak memasang ekstensi intl; "1.1. " Jika server dikompilasi dengan ICU 4.2 atau lebih rendah.

Akhirnya, lari

php composer.phar update symfony/icu

di mesin pengembangan Anda, uji secara ekstensif dan terapkan lagi. Penginstalan dependensi sekarang akan berhasil.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.