İçeriğe geç
Muhammet Şafak
en

Composer'a geçiş: PHP bağımlılıklarını elle yönetmeyi bırakmak

require yığınından modern bağımlılık yönetimine geçişin pratiği: composer.json, autoload ve paket kurma.

Kapak görseli — sunucu kabininde eth0 portuna takılı, üzerinde Composer etiketi olan mor ışıklı kablo; yanda boş eth1 ve rafta sarılı gri kablo

Bu yazı 12 yıl önce yazıldı — o günün koşullarını yansıtır.


Birkaç ay öncesine kadar her yeni projeye başladığımda yaptığım şey şuydu: ihtiyaç duyduğum kütüphanelerin zip dosyasını indirmek, lib/ ya da vendor/ adını verdiğim bir klasöre atmak ve dosyanın tepesine elle require satırı yazmak. Sonra o kütüphane güncelleme aldığında yine aynı işlemi tekrarlamak. Bir projede üç farklı kütüphanenin bağımlılıkları çakışınca ne yapacağımı bilememek.

Bu düzensizliği gidermek için Composer’a geçtim. Şimdiye kadar kullandığım en doğru araç kararlarından biri olduğunu söyleyebilirim. Hâlâ öğreniyorum, ama artık eskiye dönmek istemiyorum. Composer’ın autoload’u asıl anlamını PHP’de namespace ile kodu düzenli tutmakla birlikte kazanıyor: sınıflarınızı namespace’lere yerleştirdiğinizde require satırlarına bir daha hiç dönmüyorsunuz.

Composer nedir?

Dependency Manager (bağımlılık yöneticisi), PHP projesinin hangi dış kütüphaneleri kullandığını takip eden, bunları yükleyen ve güncelleyen bir araçtır. Composer, PHP ekosistemi için tam olarak bunu yapar.

Ruby’deki Bundler’dan, Node.js’teki npm’den esinlenilmiş. PHP dünyasına 2012’de geldi; 2014’te artık ciddi projelerde standart sayılıyor.

Kurulumu tek satır:

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Bundan sonra composer komutu her yerden çalışır.

composer.json nedir ve ne işe yarar?

Projenin kök dizinine koyduğunuz composer.json dosyası, projenin ihtiyaç duyduğu paketleri ve sürüm kısıtlamalarını tanımlar. Önceki elle yönetilen require yığınının yerini alır.

Basit bir örnek:

{
    "require": {
        "monolog/monolog": "1.7.*",
        "guzzle/guzzle": "3.8.*"
    }
}

composer install çalıştırdığınızda Composer bu paketleri Packagist’ten indirir ve vendor/ klasörüne yerleştirir. Bir de composer.lock dosyası oluşturur; bu dosya kullandığınız tam sürümleri kaydeder. Takım çalışmasında veya sunucuya taşırken composer install aynı sürümleri kurar, beklenmedik sürüm farklarının önüne geçer.

Paketi güncellemek için:

composer update monolog/monolog

Ya da tüm bağımlılıkları güncellemek için sadece composer update.

Otomatik yükleme (Autoloading)

Composer’ın en büyük kazancı paket kurmanın yanı sıra autoloading sağlamasıdır. Artık her dosyaya require_once yazmak zorunda değilsiniz.

composer.json’a bir autoload bölümü ekleyip projenizin kaynak klasörünü belirtiyorsunuz:

{
    "require": {
        "monolog/monolog": "1.7.*"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

Ardından composer dump-autoload çalıştırıyorsunuz. Bu noktadan itibaren src/ altındaki App\ ad alanıyla (namespace) yazılmış her sınıf otomatik olarak bulunur. Projenizin giriş dosyasına tek satır eklemeniz yeterli:

<?php
require 'vendor/autoload.php';

Tek satır, tüm kütüphaneler ve kendi sınıflarınız kullanılabilir hale gelir.

Yeni paket eklemek

Bir paket kurmak artık şu kadar:

composer require guzzle/guzzle:~3.8

Composer composer.json’ı günceller, paketi indirir ve autoload haritasını yeniler. Elle hiçbir şey yazmıyorsunuz.

Geliştirme bağımlılıkları

Test ve geliştirme araçları canlı ortamda bulunmamalıdır. require-dev ile bunları ayırabilirsiniz:

{
    "require": {
        "monolog/monolog": "1.7.*"
    },
    "require-dev": {
        "phpunit/phpunit": "4.0.*"
    }
}

Canlı sunucuda composer install --no-dev ile geliştirme araçlarını atlamak mümkün.

composer.lock ve sürüm tutarlılığı

composer.lock dosyasını versiyon kontrolüne eklemek önemli. Bu dosya olmadan iki farklı bilgisayarda ya da geliştirme ile canlı sunucuda composer install çalıştırmak farklı küçük sürümler getirebilir. Kütüphanelerin küçük güncellemeleri zaman zaman beklenmedik davranış değişikliğine yol açıyor. composer.lock sayesinde takımdaki herkes ve sunucu aynı bayt-bayt özdeş sürümleri kullanıyor. composer.json niyeti, composer.lock gerçeği temsil ediyor diyebilirim.

Neden bu geçişi geciktirdim?

Dürüst olmak gerekirse, “bende çalışıyor” mantığıyla epey zaman harcadım. Composer’ı öğrenmek birkaç saatlik bir yatırım istiyor ama bir kez alışınca elle bağımlılık yönetiminin ne kadar verimsiz olduğunu fark ediyorsunuz. Özellikle birden fazla projeyi aynı anda yönetiyorsanız bu fark çok belirgin.

Packagist’te on binlerce paket var ve hepsi tek komutla erişilebilir. Bundan böyle bir kütüphane ihtiyacı duyduğumda önce Packagist’te bakıyorum, sonra composer require yazıyorum.

Küçük bir değişiklik gibi görünebilir ama çalışma biçimimi gerçekten değiştirdi.

Bu konudaki deneyler

Framework'e bağlanmadan çalışan modüler PHP kütüphaneleri; 39 paketlik InitPHP ekosistemine ve Framework3'e dönüştü.

Şu an ne yapıyor

39 paketlik bir PHP kütüphane ailesi: Router, Database, Cache, Mailer, Socket ve diğerleri hem tek başına hem birlikte çalışıyor, hepsi Composer/Packagist üzerinden MIT lisansıyla dağıtılıyor. Framework'e bağlanmadan parça kullanmak isteyen PHP geliştiricisi bugün kurabilir.

Açık kaynak PHP Composer PHPUnit
Ocak 2021 — Ağustos 2022
Etiketler: #PHP#Composer
Uzmanlık: PHP Geliştirici
Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

İlgili Yazılar

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi