Bagaimana cara menghapus dependensi yang tidak digunakan dari komposer?

210

Saya menginstal paket dengan komposer, dan menginstal banyak paket lain sebagai dependensi.

Sekarang saya menghapus paket utama composer remove packageauthor/packagename, tetapi semua dependensi lama tidak dihapus. Saya berharap komposer untuk membersihkan dan hanya menyimpan paket yang diperlukan sesuai dengan composer.jsondan ketergantungannya.

Bagaimana saya bisa memaksa komposer untuk membersihkan dan menghapus semua paket yang tidak digunakan?

Lorenz Meyer
sumber

Jawaban:

377

Cara yang tepat untuk melakukan ini adalah:

composer remove jenssegers/mongodb --update-with-dependencies

Saya harus mengakui bahwa bendera di sini tidak begitu jelas mengenai apa yang akan dilakukan.

Memperbarui

composer remove jenssegers/mongodb

Pada v1.0.0-beta2 --update-with-dependencies adalah default dan tidak lagi diperlukan.

Denis Pshenov
sumber
terima kasih kepada @Yehosef untuk memulai masalah di github di mana solusi diberikan, tetapi karena dia tidak memperbarui jawabannya saya memutuskan untuk menulis sendiri untuk kenyamanan semua orang
Denis Pshenov
Terima kasih, saya tidak mengakhiri diskusi mereka.
Lorenz Meyer
3
Satu hal yang perlu diperhatikan: Jika Anda sudah melakukannya composer remove …, tetapi lupa --update-with-dependenciessampai Anda menemukan pertanyaan ini - panggilan selanjutnya untuk composer removetidak akan membunuh semua dependensi. Anda harus kembali, komposer install, kemudiancomposer remove --update-with-dependencies
Mike G
Sekarang saya mendapatkan pesan berikut:You are using the deprecated option "update-with-dependencies". This is now default behaviour. The --no-update-with-dependencies option can be used to remove a package without its dependencies
Pathros
4
Bagaimana dengan pembersihan setelah penghapusan paket? - Di situlah jawaban @LorenzMeyer masuk: composer updateJempol ke jawaban ini untuk @LorenzMeyer
Allen Linatoc
29

Padahal, itu sangat mudah.

composer update

akan melakukan semua ini untuk Anda, tetapi itu juga akan memperbarui paket lain.

Untuk menghapus paket tanpa memperbarui yang lain, tentukan paket itu dalam perintah, misalnya:

composer update monolog/monolog

akan menghapus monolog/monologpaket.

Namun demikian, mungkin ada beberapa folder atau file kosong yang tidak dapat dihapus secara otomatis, dan yang harus dihapus secara manual.

Lorenz Meyer
sumber
8
bagian yang disayangkan tentang ini adalah memaksa Anda untuk memperbarui paket Anda, bukan hanya menghapus versi lama. Misalnya, jika saya memiliki dua paket AAA / aaa ~ 1 dan versi BBB / bbb ~ 2 dan saya saat ini di versi 1.0 dari AAA / aaa dan mereka merilis 1.1, maka ketika saya menghapus BBB / bbb saya secara otomatis diperbarui (yang mungkin tidak jadilah apa yang ingin saya lakukan ..)
Yehosef
Kamu benar. Jika Anda memiliki solusi yang lebih baik, kembali dan kirimkan sebagai jawaban.
Lorenz Meyer
3
Saya belum - saya hanya ingin menunjukkan kepada orang lain perangkap dari pendekatan ini.
Yehosef
itu benar-benar harus menjadi bendera pada pemasangan komposer .. sesuatu seperti--prune
Yehosef
1
jika Anda menyukai gagasan itu, Anda dapat memilihnya - github.com/composer/composer/issues/3751
Yehosef
20

perintah berikut akan melakukan hal yang sama dengan sempurna

rm -rf vendor

composer install 
Max Wen
sumber
2
Ini sepertinya menjadi pilihan terbersih. Hapus direktori vendor dan biarkan Komposer menarik semua yang baru.
Machavity
4
ini gaya npm "save my day";)
r34
composer installakan secara otomatis menghapus paket
Yidir
10

Jalankan saja composer install- itu akan membuat vendordirektori Anda mencerminkan dependensi dalam composer.lockfile.

Dengan kata lain - itu akan menghapus semua vendor yang hilang composer.lock.

Harap perbarui komposer itu sendiri sebelum menjalankan ini.

Valentas
sumber