Memakai Composer Untuk Mengelola Ketergantungan Proyek Di PHP


Pada sebuah sesi interview, saya sebagai the Java guy ditanya mengenai kesediaan untuk terlibat dalam proyek web yang dikembangkan dengan memakai PHP dan framework Laravel. Setelah interview selesai, karena rasa penasaran, saya mencoba mencari tahu seperti apa teknologi yang berkaitan dengan PHP mengingat saya jarang memakai ‘pemanis’ di PHP. Sebuah fakta menarik yang saya jumpai adalah banyak framework dan library PHP dapat disertakan ke dalam proyek melalui Composer.

Saya melihat Composer sebagai sebuah dependency manager sama halnya seperti (atau lebih terbatas) Maven atau Ivy di Java. Pengguna menentukan apa saja library yang dibutuhkan dalam proyek mereka dan Composer akan men-download seluruh library yang dibutuhkan secara otomatis (beserta ketergantungannya bila ada). Pada Java, sebuah unit yang dapat disertakan ke dalam proyek lain adalah sebuah file JAR. Pada Composer, unit tersebut, disebut sebagai package, berada dalam bentuk kumpulan file PHP dalam sebuah folder yang sudah memiliki metadata. Agar dapat di-download oleh berbagai pengguna, setiap pembuat package harus meletakkan hasil karya mereka dalam sebuah repository. Repository resmi untuk Composer (main repository) adalah https://packagist.org. Hal ini sama seperti Maven Central Repository yang berisi banyak (hampir semua) library open source Java di http://search.maven.org. Bedanya, Composer dapat memakai VCS seperti GitHub sebagai repository selama mereka memiliki file composer.json.

Bila pada proyek Java yang memakai Maven, saya mendefinisikan ketergantungan proyek pada file pom.xml, maka pada Composer, saya mendefinisikan ketergantungan proyek pada file yang disebut composer.json. Sebagai contoh, bila saya ingin memakai Twig pada proyek, maka saya dapat membuat file composer.json dengan isi seperti berikut ini:

{
  "require": {
     "twig/twig": "1.15.1"
  }
}

Setiap package Composer memiliki nama pengenal yang terdiri atas nama vendor dan nama proyek seperti twig/twig, symfony/console, laravel/framework dan sebagainya. Setiap package dapat memiliki satu atau lebih versi. Composer juga mendukung wildcard pada versi seperti 1.*.

Setelah membuat file composer.json pada direktori proyek, saya perlu memberikan perintah composer install untuk men-download file yang dibutuhkan, seperti yang terlihat pada gambar berikut ini:

Men-download package yang dibutuhkan secara otomatis

Men-download package yang dibutuhkan secara otomatis

Struktur folder yang dihasilkan akan terlihat seperti berikut ini:

Latihan
\---vendor
    \---composer
    \---twig
    +---autoload.php
+---composer.json
+---composer.lock

Composer menghasilkan sebuah file composer.lock dan sebuah folder bernama vendor yang berisi package yang dibutuhkan oleh proyek. Selain itu, pada folder vendor, terdapat file autoload.php yang dapat dipakai untuk men-include packages yang ada secara mudah.

Bila saya melakukan perubahan dependency pada file composer.json, maka saya perlu memberikan perintah composer update untuk memperbaharui isi folder vendor.

Bagaimana bila saya ingin memakai Composer secara offline, misalnya saat tidak terhubung ke internet? Composer sebenarnya menyimpan file yang pernah di-download ke dalam sebuah cache sehingga ia masih bisa bekerja secara offline. Untuk mengetahui lokasi cache, saya dapat memberikan perintah composer config --list dan melihat isi cache-dir seperti berikut ini:

C:\>composer config --list
...
[cache-dir] C:/Users/Me/AppData/Local/Composer
[cache-files-dir] {$cache-dir}/files (C:/Users/Me/AppData/Local/Composer/files)
[cache-repo-dir] {$cache-dir}/repo (C:/Users/Me/AppData/Local/Composer/repo)
[cache-vcs-dir] {$cache-dir}/vcs (C:/Users/Me/AppData/Local/Composer/vcs)
...
[home] C:/Users/Me/AppData/Roaming/Composer

Composer juga memiliki perintah create-project yang pada dasarnya akan men-clone source dari package yang diberikan. Hal ini tampak aneh karena jarang saya temui di Java. Perintah create-project tidak banyak berguna untuk library seperti Twig, tapi ia sangat berguna bagi package yang berperan sebagai skeleton. Sebagai contoh, package laravel/laravel (bisa dilihat di https://github.com/laravel/laravel) mengandung folder seperti app/controllers, app/models, app/views, public dan sebagainya yang tinggal diubah atau ditambah oleh pengguna. Hal ini berbeda dengan package laravel/framework yang berisi library atau kode program framework Laravel itu sendiri.

Sebagai contoh, untuk membuat sebuah proyek baru yang memakai framework Laravel, saya dapat memberikan perintah seperti pada gambar berikut ini:

Memakai create-package di Composer

Memakai create-package di Composer

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: