Komposer memiliki opsi untuk memuat beberapa dependensi hanya saat sedang dalam pengembangan, sehingga alat tidak akan diinstal dalam produksi (pada server langsung). Ini (secara teori) sangat berguna untuk skrip yang hanya masuk akal dalam pengembangan, seperti tes, alat data palsu, debugger, dll.
Cara untuk pergi adalah menambahkan require-dev
blok tambahan dengan alat yang Anda butuhkan di dev:
"require-dev": {
"codeception/codeception": "1.6.0.3"
}
dan kemudian (secara teoritis) memuat dependensi ini melalui
composer install --dev
Masalah & pertanyaan:
Komposer telah mengubah perilaku install
dan update
secara dramatis pada tahun 2013, require-dev
-dependensi sekarang diinstal secara default (!), Jangan ragu untuk membuat komposer. Json dengan require-dev
blok dan melakukan composer install
mereproduksi.
Sebagai cara yang paling diterima untuk menyebarkan adalah dengan mendorong komposer. mengunci (yang menahan pengaturan komposer Anda saat ini) dan kemudian melakukan composer install
pada server produksi, ini juga akan menginstal hal pengembangan.
Apa cara yang benar untuk menggunakan ini tanpa menginstal dependensi -ev?
Catatan: Saya mencoba membuat Tanya Jawab kan di sini untuk memperjelas penyebaran Komposer yang aneh. Jangan ragu untuk mengedit pertanyaan ini.
sumber
composer.lock
tidak boleh ditambahkan ke repo Git, tidak pernah. Pendekatan yang tepat adalah dengan menggunakan pembaruan komposer pada pementasan dan kemudian menyinkronkan file menjadi produksi (jika semuanya berfungsi, tentu saja). Pementasan harus merupakan salinan tepat dari lingkungan produksi.composer.lock
harus menjadi bagian dari.gitignore
.Jawaban:
Mengapa
Ada IMHO alasan bagus mengapa Komposer akan menggunakan
--dev
flag secara default (saat menginstal dan memperbarui) saat ini. Komposer sebagian besar dijalankan dalam skenario di mana ini perilaku yang diinginkan:Alur kerja Komposer dasar adalah sebagai berikut:
composer.phar install --dev
:, file json dan kunci dikomit ke VCS.composer.phar install --dev
.composer.phar require <package>
tambahkan--dev
jika Anda ingin paket direquire-dev
bagian (dan komit).composer.phar install --dev
.composer.phar update --dev <package>
(dan melakukan).composer.phar install --dev
.composer.phar install --no-dev
Seperti yang Anda lihat,
--dev
flag digunakan (jauh) lebih dari--no-dev
flag, terutama ketika jumlah pengembang yang bekerja pada proyek bertambah.Penempatan produksi
Nah, file
composer.json
dancomposer.lock
harus dikomit ke VCS. Jangan hilangkancomposer.lock
karena mengandung informasi penting tentang versi paket yang harus digunakan.Saat melakukan penyebaran produksi, Anda dapat meneruskan
--no-dev
bendera ke Komposer:The
composer.lock
File mungkin berisi informasi tentang dev-paket. Ini tidak masalah. The--no-dev
bendera akan memastikan mereka dev-paket tidak diinstal.Ketika saya mengatakan "penyebaran produksi", maksud saya penyebaran yang ditujukan untuk digunakan dalam produksi. Saya tidak berdebat apakah
composer.phar install
harus dilakukan pada server produksi, atau pada server pementasan di mana hal-hal dapat ditinjau. Itu bukan cakupan dari jawaban ini. Saya hanya menunjukkan bagaimanacomposer.phar install
tanpa menginstal dependensi "dev".Menyimpang dari topik
The
--optimize-autoloader
flag mungkin juga diinginkan pada produksi (menghasilkan kelas-peta yang akan mempercepat autoloading dalam aplikasi Anda):Atau ketika penyebaran otomatis dilakukan:
Jika basis kode Anda mendukung, Anda bisa menukar
--optimize-autoloader
untuk--classmap-authoritative
. Info lebih lanjut di sinisumber
--optimize-autoloader
. Pertimbangkan juga--classmap-authoritative
- Dari dokumentasi di sini getcomposer.org/doc/03-cli.md Anda dapat melihat ini: "Hanya memuat kelas dari classmap saja. Secara implisit memungkinkan --optimize-autoloader" sehingga Anda dapat menggunakan jika Anda tahu kelasnya " there ", yang mungkin harus terjadi di lingkungan prod Anda kecuali Anda menghasilkan kelas secara dinamis.optimize-autoloader
langsung dicomposer.json
:{"config": { "optimize-autoloader": true } }
Sebenarnya, saya akan sangat menyarankan MELAWAN menginstal dependensi pada server produksi.
Rekomendasi saya adalah untuk checkout kode pada mesin penyebaran, instal dependensi sesuai kebutuhan (ini termasuk TIDAK menginstal dependensi dev jika kode masuk ke produksi), dan kemudian pindahkan semua file ke mesin target.
Mengapa?
composer install
Singkat cerita: Gunakan Komposer di lingkungan yang dapat Anda kendalikan. Mesin pengembangan Anda memenuhi syarat karena Anda sudah memiliki semua hal yang diperlukan untuk mengoperasikan Komposer.
Perintah untuk digunakan adalah
Ini akan bekerja di lingkungan apa pun, baik itu server produksi itu sendiri, atau mesin penyebaran, atau mesin pengembangan yang seharusnya melakukan pemeriksaan terakhir untuk menemukan apakah persyaratan dev salah digunakan untuk perangkat lunak yang sebenarnya.
Perintah tidak akan menginstal, atau secara aktif menghapus, persyaratan dev yang dinyatakan dalam file composer.lock.
Jika Anda tidak keberatan menggunakan komponen perangkat lunak pengembangan pada server produksi, menjalankan
composer install
akan melakukan pekerjaan yang sama, tetapi hanya meningkatkan jumlah byte yang dipindahkan, dan juga membuat deklarasi autoloader yang lebih besar.sumber
app-1.34.phar
dll). Ada mekanisme terpisah yang diberitahukan dan memutuskan kapan harus mengambil file itu, ke mana harus mentransfernya, dan kemudian apa yang harus dilakukan dengannya. Beberapa tim memilih untuk membongkar phar begitu ada di server dan beberapa tim menjalankannya apa adanya. Ini meminjamkan banyak kepercayaan pada stabilitas dan reproduktifitas dari penyebaran kami.Sekarang
require-dev
diaktifkan secara default, untuk pengembangan lokal Anda dapat melakukancomposer install
dancomposer update
tanpa--dev
opsi.Saat Anda ingin menggunakan produksi, Anda harus memastikan
composer.lock
tidak memiliki paket yang berasalrequire-dev
.Anda dapat melakukannya dengan
Setelah Anda menguji secara lokal dengan
--no-dev
Anda dapat menggunakan semuanya untuk produksi dan menginstal berdasarkancomposer.lock
. Anda perlu--no-dev
opsi lagi di sini, jika komposer akan mengatakan "File kunci tidak berisi informasi dev-kebutuhan" .Catatan: Hati-hati dengan apa pun yang berpotensi menimbulkan perbedaan antara dev dan produksi! Saya biasanya mencoba untuk menghindari keharusan-dev sedapat mungkin, karena menyertakan alat dev bukanlah overhead yang besar.
sumber
composer.lock
dependensi dev. Anda cukup menjalankancomposer install --no-dev
, dan Anda hanya akan menginstal dependensi reguler - pada kenyataannya, Komposer juga akan menghapus dependensi dev apa pun di langkah ini.composer.lock
memiliki dependensi dev di dalamnya (dan berpotensi mempengaruhi versi paket non-dev) maka saya ingin memperbaruinya untuk mencerminkan bagaimana itu akan di produksi. Ini juga memaksa Anda untuk menjalankancomposer install --no-dev
produksi, seperti yangcomposer install
akan terjadi kesalahan. Secara teknis saya pikir Anda benar; ini tidak diperlukan, tetapi ini adalah tingkat keamanan ekstra, yang saya suka.dev/tool
danprod/lib:~1.0
. Prod / lib terbaru adalah 1.3, tetapi dev / tool juga membutuhkanprod/lib:1.1.*
. Hasil: Anda akan menginstal versi 1.1.9 (terbaru dari cabang 1.1.x) dan menggunakannya selama pengembangan Anda. Saya akan mengatakan itu TIDAK aman untuk hanya memperbarui--no-dev
, sehingga termasuk prod / lib 1.3 terbaru dan menganggap semuanya berfungsi tanpa pengujian. Dan mungkin pengujian tidak mungkin karena kurangnya dev / tool. Saya akan berasumsi bahwa karena dev / tool tidak diperlukan dalam produksi, itu tidak boleh diluncurkan, tetapi perangkat lunak harus menggunakan prod / lib 1.1.9 lalu.--no-dev
maka Anda perlu mengujinya secara lokal, seperti yang saya sebutkan dalam jawabannya. Saya masih merekomendasikan untuk tidak menggunakan--no-dev
sama sekali.composer update
lalu lakukan pengembangan, lalu lakukancomposer update --no-dev
, lalu lakukan pengujian rilis, lalu dorong produksi dan lakukancomposer install --no-dev
. Dua masalah: 1. Saya tidak bisa menguji rilis tanpa dependensi dev, dan 2. Saya tidak bisa menginstal dengan misalnya Git dalam produksi.Pada server produksi saya mengganti nama
vendor
menjadivendor-<datetime>
, dan selama penyebaran akan memiliki dua dir vendor.Cookie HTTP menyebabkan sistem saya memilih vendor baru
autoload.php
, dan setelah pengujian saya melakukan pergantian atom / instan sepenuhnya di antara mereka untuk menonaktifkan dir vendor lama untuk semua permintaan di masa depan, kemudian saya menghapus dir sebelumnya beberapa hari kemudian.Ini menghindari masalah yang disebabkan oleh cache sistem file yang saya gunakan di apache / php, dan juga memungkinkan kode PHP aktif untuk terus menggunakan dir vendor sebelumnya.
Meskipun ada jawaban lain yang merekomendasikan hal itu, saya secara pribadi berlari
composer install
di server, karena ini lebih cepat daripada rsync dari area stage saya (VM di laptop saya).Saya menggunakan
--no-dev --no-scripts --optimize-autoloader
. Anda harus membaca dokumen untuk masing-masing untuk memeriksa apakah ini sesuai pada lingkungan Anda.sumber
Saya pikir lebih baik mengotomatiskan proses:
Tambahkan file composer.lock di repositori git Anda, pastikan Anda menggunakan composer.phar instal --no-dev ketika Anda rilis, tetapi di mesin dev Anda bisa menggunakan perintah komposer tanpa khawatir, ini tidak akan berlaku untuk produksi, produksi akan mendasarkan ketergantungannya pada file kunci.
Di server Anda checkout versi atau label khusus ini, dan menjalankan semua tes sebelum mengganti aplikasi, jika tes lulus Anda melanjutkan penyebaran.
Jika tes bergantung pada dependensi dev, karena komposer tidak memiliki dependensi cakupan pengujian, solusi yang tidak terlalu bagus dapat menjalankan tes dengan dependensi dev ( pemasangan composer.phar ), hapus pustaka vendor, jalankan komposer.phar install - -tidak lagi, ini akan menggunakan dependensi cache jadi lebih cepat. Tapi itu adalah retasan jika Anda tahu konsep cakupan di alat bangun lain
Otomatiskan ini dan lupakan sisanya, minum bir :-)
PS .: Seperti dalam komentar @Sven di bawah, bukan ide yang baik untuk tidak memeriksa file composer.lock, karena ini akan membuat pekerjaan pemasangan komposer sebagai pembaruan komposer.
Anda dapat melakukan otomatisasi dengan http://deployer.org/ ini adalah alat sederhana.
sumber
composer.lock
akan membuatcomposer install
tindakan seperticomposer update
. Jadi, versi yang Anda gunakan bukan versi yang Anda kembangkan. Ini kemungkinan akan menimbulkan masalah (dan lebih lagi mengingat satu-satunya masalah keamanan yang baru saja diselesaikan dengan "ganti" di Komposer). Anda TIDAK PERNAH harus menjalankancomposer update
tanpa pengawasan tanpa memverifikasi itu tidak merusak apa pun.