Komposer: bagaimana saya bisa menginstal dependensi lain tanpa memperbarui yang lama?

196

Saya punya proyek dengan beberapa dependensi dan saya ingin menginstal yang lain, tapi saya ingin yang lain tetap seperti itu. Jadi saya sudah mengedit composer.json, tetapi jika saya jalankan composer install, saya mendapatkan output berikut:

Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Problem 1
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - Installation request for laravel/framework dev-master -> satisfiable by laravel/framework dev-master.

Pertama-tama, saya sudah menginstal mcrypt, jadi saya tidak tahu mengapa itu mengeluh tentang itu di sana.

Jadi, bagaimana saya bisa menginstal dependensi baru ini?

Komposer saya. Json:

{
    "require": {

        "opauth/opauth": "*",
        "opauth/facebook": "*",
        "opauth/google": "*",
        "opauth/twitter": "*",

        "imagine/Imagine": "dev-develop",

        "laravel/framework": "4.*",
        "loic-sharma/profiler": "dev-master"
    },
    "autoload": {
        "classmap": [
            "app/libraries",
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/tests/TestCase.php"
        ]
    },
    "minimum-stability": "dev"
}
dualitas_
sumber
1
Peringatan mcrypt dapat berasal dari beberapa pemasangan php ... php dengan ekstensi mcrypt mungkin tidak sama dengan instalasi php-cli Anda
Matthemattics

Jawaban:

293

Untuk menginstal paket baru dan hanya itu, Anda memiliki dua opsi:

  1. Menggunakan requireperintah, jalankan saja:

    composer require new/package
    

    Composer akan menebak batasan versi terbaik untuk digunakan, menginstal paket, dan menambahkannya composer.lock.

    Anda juga dapat menentukan batasan versi eksplisit dengan menjalankan:

    composer require new/package ~2.5
    

-ATAU-

  1. Dengan menggunakan updateperintah, tambahkan paket baru secara manual composer.json, lalu jalankan:

    composer update new/package
    

Jika Composer mengeluh, dengan menyatakan "Persyaratan Anda tidak dapat diselesaikan ke paket yang dapat diinstal.", Anda dapat menyelesaikan ini dengan mengoper flag --with-dependencies. Ini akan membuat daftar putih semua dependensi dari paket yang Anda coba instal / perbarui (tetapi tidak ada dependensi Anda yang lain).

Mengenai masalah pertanyaan penanya dengan Laravel dan mcrypt: periksa apakah diaktifkan dengan benar di CLI php.ini Anda. Jika php -mtidak mencantumkan mcrypt maka itu hilang.

Penting: Jangan lupa untuk menentukan new/packagekapan menggunakan composer update! Dengan mengabaikan argumen itu, semua dependensi composer.lockakan diperbarui.

Seldaek
sumber
3
Saya menerima pesan "Paket [...] yang terdaftar untuk pembaruan tidak diinstal. Mengabaikan."
Gerry
11
Ini tidak berhasil untuk saya. Saya diberitahu 'Paket "x / y" terdaftar untuk pembaruan tidak diinstal. Mengabaikan. "Dan kemudian memperbarui semua. Jadi tidak menginstal paket baru yang saya inginkan dan memperbarui semua yang lain, yang merupakan kebalikan dari apa yang saya inginkan.
gemetar
3
Itu tidak bekerja. "Persyaratan Anda tidak dapat diselesaikan ke paket yang dapat diinstal." (dan teks tentang beberapa paket lama, tidak ada hubungannya sama sekali dengan yang saya minta) ketika saya bertanya, perbarui satu paket saja.
OZ_
@tremby Bekerja dengan baik di sini. Mungkin Anda lupa menambahkan "new/package" : "*",di "require"bagian composer.json ?
Potherca
@ OZ_ Sekalipun hanya satu dependensi yang akan diinstal, itu masih harus diselesaikan terlebih dahulu untuk memastikan itu tidak bertentangan dengan dependensi Anda yang lain.
Potherca
30

Sebenarnya, solusi yang benar adalah:

composer require vendor/package

Diambil dari dokumentasi CLI untuk Komposer :

The requireperintah menambahkan paket baru untuk composer.jsonfile dari direktori saat ini.

php composer.phar require

Setelah menambahkan / mengubah persyaratan, persyaratan yang dimodifikasi akan diinstal atau diperbarui.

Jika Anda tidak ingin memilih persyaratan secara interaktif, Anda bisa meneruskannya ke perintah.

php composer.phar require vendor/package:2.* vendor/package2:dev-master

Meskipun benar bahwa composer updatemenginstal paket baru yang ditemukan di composer.json, itu juga akan memperbarui file composer.lock dan semua paket yang diinstal sesuai dengan logika fuzzy ( >atau *karakter setelah titik dua) ditemukan di composer.json! Ini dapat dihindari dengan menggunakan composer update vendor/package, tetapi saya tidak akan merekomendasikan untuk membiasakannya, karena Anda satu argumen terlupakan dari proyek yang berpotensi rusak ...

Pertahankan keadaan dengan tetap waras composer require vendor/packageuntuk menambah ketergantungan baru! 😉

Matthemattics
sumber
Tetapi apakah akan menggunakan composer requirememperbarui file composer.lock?
Phil
2

Kasing saya lebih sederhana, dan hanya cocok dengan judul Anda tetapi tidak detail Anda lebih lanjut.

Artinya, saya ingin menginstal paket baru yang belum ada di saya composer.jsontanpa memperbarui semua paket lainnya.

Solusinya di sini adalah composer require x/y

gemetar
sumber
1

Dalam kasus saya, saya memiliki repo dengan:

  • persyaratan A, B, C, D in .json
  • tetapi hanya A, B, C dalam .lock

Sementara itu, A, B, C memiliki versi yang lebih baru sehubungan dengan kunci dibuat.

Untuk beberapa alasan, saya menghapus "vendor" dan ingin melakukan composer installdan gagal dengan pesan:

Warning: The lock file is not up to date with the latest changes in composer.json.
You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Saya mencoba menjalankan solusi dari Seldaek mengeluarkan composer update vendorD/libraryDtapi komposer bersikeras untuk memperbarui lebih banyak hal, jadi .lockterlalu banyak perubahan melihat alat git saya.

Solusi yang saya gunakan adalah:

  1. Hapus semua vendorsdir.
  2. Hapus sementara persyaratan VendorD/LibraryDdari .json.
  3. lari composer install.
  4. Kemudian hapus file .jsondan checkout kembali dari repo (setara dengan menambahkan kembali file, tetapi menghindari kemungkinan perubahan spasi putih).
  5. Kemudian jalankan solusi Seldaek composer update vendorD/libraryD

Memang menginstal perpustakaan, tetapi di samping itu, gitdiff menunjukkan kepada saya bahwa .lockhanya hal-hal baru yang ditambahkan tanpa mengedit yang lain.

(Thnx Seldaek untuk penunjuk;))

Xavi Montero
sumber
itu berlebihan. hapus saja file kunci dan jalankan instal komposer. itu bekerja
astroanu
6
Itu tetap berlaku untuk lingkungan non-pro, di mana Anda dapat dengan senang hati membangun kembali dependensi dan jika sesuatu merusak Anda pergi dan memperbaikinya. Tetapi jika bagi Anda, server yang gagal berarti Anda kehilangan $ 10.000 per jam, maka Anda tidak ragu bahwa composer.lockseharusnya tidak pernah dengan senang hati dihapus dan dibangun kembali. .lockadalah ... untuk mengunci !! ; D - jika file kunci tidak akan berguna dan Anda tidak akan melakukannya atau tidak ada sama sekali. Jika Anda menjalankan perusahaan yang berorientasi pada kualitas dan membangun kembali dan melakukan kunci dengan mengatakan 1.000 dependensi, semuanya akan berubah, dan orang-orang QA akan datang untuk membunuh Anda hahaha.
Xavi Montero
2
Hai @astroanu hanya untuk mengklarifikasi bahwa jika Anda menginstal dependensi pada tanggal yang lebih awal dan beberapa dependensinya meraih versi terbaru dari master dev maka mungkin ada masalah yang signifikan hanya dengan menghapus composer.lock dan hanya menekan instal. Jika Anda belum memiliki kesempatan untuk memverifikasi dampak dari memperkenalkan ketergantungan maka ada potensi untuk hasil yang tidak terduga dan mungkin menciptakan pengalaman yang buruk bagi pengguna.
dkcwd
tentu saja, menghapus file kunci dan menjalankan install / update atau menjalankan pembaruan bahkan tanpa menghapus file kunci akan berdampak pada stabilitas aplikasi. Pembaruan komposer harus dijalankan pada lingkungan dev saja. Pada produksi selalu gunakan komposer instal karena build produksi diuji terhadap apa yang disimpan pada file kunci.
astroanu