Dua chapter sebelumnya, composer.json menyatakan keinginan dan composer.lock membekukan keputusan. Chapter ini adalah tempat semuanya bergerak: kita memasang dependensi nyata, mengintip folder vendor/ yang terbentuk, menggunakan pustaka yang baru saja jatuh ke disk, lalu mencopotnya kembali dengan rapi. Sepanjang jalan kita juga meluruskan perbedaan composer install versus composer update — distingsi yang paling sering disalahpahami pemula dan paling sering merusak hari-hari tim. Seluruh sesi terminal diambil dari proyek demo sungguhan bernama toko-dependencies yang dimulai dari composer.json minimal:
{
"name": "budi/toko-dependencies",
"description": "Demo instalasi dependensi",
"type": "project",
"license": "MIT",
"require": {}
}Memasang Dependensi Pertama dengan require #
Perintah composer require <paket> adalah pintu masuk utama: satu perintah ini menambahkan entri ke composer.json, menyelesaikan versi, memperbarui composer.lock, mengunduh paket ke vendor/, dan menghasilkan ulang autoloader. Kita pasang monolog — pustaka logging paling populer di ekosistem PHP:
cd toko-dependencies
composer require monolog/monologOutput yang Dihasilkan:
./composer.json has been updated
Running composer update monolog/monolog
Loading composer repositories with package information
Updating dependencies
Lock file operations: 2 installs, 0 updates, 0 removals
- Locking monolog/monolog (3.12.1)
- Locking psr/log (3.0.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
- Installing psr/log (3.0.2): Extracting archive
- Installing monolog/monolog (3.12.1): Extracting archive
11 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
Using version ^3.12 for monolog/monologMari kita bedah momen-momen pentingnya:
./composer.json has been updated: entri"monolog/monolog": "^3.12"ditambahkan otomatis ke manifesto — kita tidak menyentuh editor sama sekali.Locking monolog/monolog (3.12.1)danLocking psr/log (3.0.2): resolver bekerja untuk monolog beserta dependensi transitivenya; psr/log ikut karena monolog membutuhkannya.Installing ... Extracting archive: kedua paket diunduh dari Packagist dan diekstrak ke foldervendor/.Using version ^3.12 for monolog/monolog: kendala caret dipilih sebagai bawaan karena dianggap paling aman untuk paket yang patuh semantic versioning.
Apa yang Terjadi di Folder vendor #
Semua paket terpasang di dalam satu folder vendor/ milik proyek. Mari kita lihat isinya:
ls -F vendor/Output yang Dihasilkan:
autoload.php
composer/
monolog/
psr/Struktur tersebut menjelaskan dirinya sendiri: vendor/monolog/ dan vendor/psr/ menampung kode pustaka yang barusan dipasang, sementara vendor/autoload.php bersama folder vendor/composer/ berisi autoloader beserta metadata buatan Composer. Di dalam paket monolog, kita menemukan struktur khas sebuah paket PHP:
ls -F vendor/monolog/monolog/Output yang Dihasilkan:
CHANGELOG.md
LICENSE
README.md
composer.json
src/Folder src/ memuat class-class monolog, dan composer.json di dalamnya adalah manifesto milik paket — bukan milik proyek kita — yang menjelaskan dependensi serta aturan autoload paket tersebut. Composer membaca berkas-berkas ini berlapis-lapis untuk menyusun satu autoloader terpadu di vendor/autoload.php.
install vs update #
Inilah distingsi terpenting chapter ini, jadi kita pelan-pelan. composer install adalah perintah patuh: ia memasang persis apa yang tertulis di composer.lock, dan kalau lock belum ada, resolusi baru dibuat. composer update adalah perintah kreatif: ia mengabaikan isi lock, menyelesaikan ulang seluruh kendala dari composer.json, lalu menulis lock baru.
| Perintah | Sumber keputusan | Menulis ulang lock? | Dipakai kapan |
|---|---|---|---|
composer install | composer.lock | Tidak | Setelah clone/pull, di CI, saat deploy |
composer update | composer.json | Ya | Saat sengaja menaikkan versi dependensi |
Kita buktikan keduanya di proyek yang sama. Pertama, composer install pada kondisi sudah terpasang:
composer installOutput yang Dihasilkan:
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Nothing to install, update or remove
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!Tidak ada satu byte pun yang berubah — Nothing to install, update or remove — karena isi vendor/ sudah memenuhi lock. Sekarang bandingkan dengan composer update pada proyek yang sama:
composer updateOutput yang Dihasilkan:
Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Writing lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.Meskipun hasil akhirnya sama-sama tanpa perubahan, prosesnya berbeda: update tetap membuka koneksi ke Packagist (Loading composer repositories), memeriksa seluruh versi tersedia, lalu menyimpulkan Nothing to modify in lock file karena versi terkunci memang sudah yang tertinggi. Pada hari ketika monolog merilis versi baru, perintah install di mesin rekan tim Anda tidak akan berubah sedikit pun, sementara update akan menaikkan versi dan menulis lock baru. Kebiasaan yang sehat untuk aplikasi: jalankan install setiap hari, jalankan update hanya saat Anda sengaja ingin memperbarui dependensi dan siap mengujinya.
Menggunakan Dependensi dalam Kode #
Seluruh class dari paket terpasang dapat dipakai setelah satu baris require untuk autoloader. Berikut skrip kecil coba-monolog.php yang memakai monolog untuk mencatat dua pesan ke terminal:
<?php
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\LineFormatter;
$formatter = new LineFormatter("%level_name%: %message%\n");
$handler = new StreamHandler('php://stdout', Logger::INFO);
$handler->setFormatter($formatter);
$logger = new Logger('aplikasi');
$logger->pushHandler($handler);
$logger->info('Aplikasi toko berhasil dijalankan');
$logger->warning('Stok produk hampir habis');Mari kita bedah skrip tersebut:
- Baris 2: autoloader hasil Composer dimuat — satu-satunya
requireyang dibutuhkan seluruh aplikasi. - Baris 4-6: tiga class monolog diimpor lewat
use. Tidak ada satu punrequireper class; autoloader yang mencarikan berkasnya. - Baris 8-11: formatter kustom memastikan output berformat
LEVEL: pesantanpa stempel waktu, dan handler menuliskannya kephp://stdoutdengan level minimalINFO. - Baris 13-17: logger bernama
aplikasidibuat, handler dipasang, lalu dua pesan dicatat.
Saat dijalankan, skrip tersebut menghasilkan:
php coba-monolog.phpOutput yang Dihasilkan:
INFO: Aplikasi toko berhasil dijalankan
WARNING: Stok produk hampir habisDua baris itu adalah bukti ujung-ke-ujung bahwa siklus Composer bekerja: manifesto, lock, unduhan, autoloader, sampai class monolog yang benar-benar berjalan di kode kita.
Melihat Paket yang Terpasang #
Seiring proyek membesar, kita perlu tahu apa saja yang sebenarnya ada di vendor/. Perintah composer show meringkas seluruh paket terpasang beserta versinya:
composer showOutput yang Dihasilkan:
monolog/monolog 3.12.1 Sends your logs to files, sockets, inboxes, database...
psr/log 3.0.2 Common interface for logging librariesDua baris itu mencerminkan isi lock: monolog yang kita minta, dan psr/log yang datang sebagai dependensi transitive. Perintah composer show <paket> menampilkan detail satu paket — dependensinya, licensenya, hingga daftar versinya di Packagist — berguna saat Anda ingin memeriksa paket sebelum menaikkan versinya.
Dependensi Pengembangan dengan –dev #
Tidak semua paket perlu ikut ke produksi. Perekap perkakas pengujian dan penganalisis kode lebih tepat hidup di require-dev; flag --dev pada composer require menaruh paket ke sana secara otomatis. Kita pasang phpstan, penganalisis statis, sebagai dependensi pengembangan:
composer require --dev phpstan/phpstanOutput yang Dihasilkan:
./composer.json has been updated
Running composer update phpstan/phpstan
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
- Locking phpstan/phpstan (2.3.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Downloading phpstan/phpstan (2.3.1)
- Installing phpstan/phpstan (2.3.1): Extracting archive
Generating autoload files
2 packages you are using is looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.
Using version ^2.3 for phpstan/phpstanAlurnya sama persis dengan require biasa; bedanya hanya wadah di manifesto. Paket perkakas juga membawa berkas yang dapat dieksekusi, yang Composer kumpulkan di satu tempat:
ls -F vendor/bin/Output yang Dihasilkan:
phpstan*
phpstan.phar*Dari sini Anda dapat menjalankan vendor/bin/phpstan analyse src langsung, atau memanggilnya lewat pintasan composer analyse bila mendefinisikan script bernama analyse seperti pada chapter composer.json
. Saat deploy produksi, opsi composer install --no-dev melewati seluruh paket dev sehingga server produksi hanya membawa yang benar-benar dipakai aplikasi.
Menghapus Dependensi dengan remove #
Siklus dependensi ditutup oleh composer remove <paket>: entri dihapus dari manifesto, lock ditulis ulang, dan berkas paket dibersihkan dari vendor/. Kita copot monolog dari proyek demo:
composer remove monolog/monologOutput yang Dihasilkan:
./composer.json has been updated
Running composer update monolog/monolog
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 0 updates, 2 removals
- Removing monolog/monolog (3.12.1)
- Removing psr/log (3.0.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 0 updates, 2 removals
- Removing psr/log (3.0.2)
- Removing monolog/monolog (3.12.1)
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found.Perhatikan bahwa psr/log ikut terangkat bersama monolog — Composer menghitung bahwa dependensi transitive itu tidak lagi dibutuhkan siapa pun, sehingga membersihkannya sekalian. phpstan tetap tinggal karena berada di require-dev, terlepas dari siapa yang mencabut monolog. Proyek pun kembali bersisa satu paket dev, manifesto dan lock selaras, dan folder vendor/ bebas dari sisa-sisa paket yang tak terpakai.
Dengan siklus pasang-pakai-cabut di tangan, satu keterampilan tersisa agar Anda benar-benar memegang kendali: membaca dan menulis kendala versi seperti ^3.12 dan ~2.7 dengan sengaja, bukan sekadar menerima bawaan Composer — topik chapter version constraints
.