PHP’de Composer ile Bağımlılık Yönetimi – 1

composer-1
Merhabalar,
Bu yazımda sizlere PHP tarafında Composer aracını kullanarak nasıl bağımlılık yönetimi yapabileceğimizi anlatmaya çalışacağım. Evet uzun bir aradan sonra tekrar Back-End Development tarafına geri dönmüş bulunuyorum. Gerçi Back-End tarafında geliştirme yapmayı hiç bırakmamıştım zaten fakat uzun zamandır back-end ile ilgili bir yazı yazmıyordum. Bu yazı ile bir geri dönüş yapmış oldum. Bu yazımızda da başlıklar şeklinde ilerliyor olacağız. Öyleyse başlayalım hemen konumuzu irdelemeye.

Bağımlılık Yönetimi Nedir?

Composer aracına geçmeden önce biraz ‘bağımlılık yönetimi’ kavramından bahsetmek istiyorum. Bunu PHP dilinden bağımsız olarak anlatacağım. Projelerimizde er ya da geç bir üçüncü parti kütüphaneye (third-party library) ihtiyaç duyarız. Hatta çoğu zaman tek bir üçüncü parti kütüphane de işlerimizi görmediği için birden çok kütüphaneyi projelerimize dahil ederiz. Fakat bu kütüphaneler de kendi içerilerinde bir proje oldukları için sürekli geliştiriliyor, çeşitli güvenlik güncelleştirmeleri geliyor ve biz de bu kütüphaneleri kullandığımız için bu güncellemeleri almak zorundayız aksi takdirde projenizde ya bir güvenlik açığıyla ya da bir takım performans sorunları ile karşılaşacaksınız. Fakat projenizde birden çok kütüphane kullandığınız için bu işlem biraz zahmetli hâl alabiliyor, hepsinin yeni versiyonlarını indirip, projenizdeki dosyalar ile değiştirmek bir hayli zahmetli bir iş.
Üstelik projenizin de boyutu bir hayli büyüyor ve taşınabilirlik zorlaşıyor. İşte tam da bu noktada bağımlılık yönetimi kavramı devreye giriyor ve: Javascript ve NodeJS’de npm isimli araç ile; Java’da Apache Ivy ile; PHP’de ise Composer isimli araç ile yardımımıza koşuyor ve bütün bu yükleri üzerimizden alıyor. Biz bu yazımızda sadece PHP’de kullandığımız Composer aracından bahsediyor olacağız.

Composer Nedir?

PHP projelerimizde kullanabileceğimiz bir bağımlılık yönetimi aracıdır. Composer ile projelerinize üçüncü parti kütüphaneleri dahil edebilir, artık bağımlılığınızın bulunmadığı bir kütüphaneyi projenizden kaldırabilir, projenizde bulunan kütüphanelerin versiyonlarını güncelleyebilir, kendi projeniz içerisinde kendiniz geliştirdiğiniz bir kütüphaneyi autoloading özelliği (Bu özelliği Composer ile ilgili bir sonraki yazımda anlatacağım) ile kullanabilirsiniz ya da bu projenin çalışabilmesi için gerekli olan en düşük PHP versiyonuna -bu da bir bağımlılıktır ne de olsa- ya da kütüphanenin çıkan sürümleri arasından istediğiniz versiyona, versiyon aralığına ya da en düşük stabiliteye(beta, alpha, dev, rc, stable) olan bağımlılığınızı belirtebilirsiniz.

Composer Kurulumu

Lokal (Proje içine) Kurulum

Konsolda proje klasörünüzdeyken:

Bilgisayarınız da curl varsa:

curl -sS https://getcomposer.org/installer | php

curl yoksa PHP ile kurulum için:

php -r "readfile('https://getcomposer.org/installer');" | php

komutunu çalıştırmanız yeterli olacaktır daha sonra php composer.phar yazarak Composer’ı projeniz içerisinde kullanabilirsiniz. Fakat bu kurulum ile Composer aracını sadece o klasör içerisindeyken kullanabilirsiniz. Zaten adı da üzerinde: Lokal kurulum. Yani proje klasörü dışındaki herhangi bir yerde php composer.phar yazmanız bir sonuç üretmeyecektir. Bu nedenle biz genelde sistemin her yerinde kullanabileceğimiz bir kurulumu tercih ediyoruz.

NOT: Kurulum komutunun çalışabilmesi için php‘nin bulunduğu klasörü PATH sistem değişkeni içerisinde göstermeniz gerekmektedir. Ayrıca lokal kurulumlar da composer.phar dosyasının herhangi bir versiyon yönetim sistemine (git, svn vb.) eklenmesi tavsiye edilmiyor. Genelde her geliştirici kendisi kurar lokal kurulum ile sizin bunu versiyon yönetim sisteminize eklemenize gerek yoktur.

Global Kurulum

Windows için

Windows içerisinde sisteminize Composer kurmak isterseniz şu bağlantıya tıklayarak kurulum aracını indirebilir ve klasik next, next, finish yöntemi ile kurabilirsiniz. Kurulum bittiğinde otomatik olarak composer.phar dosyasının bulunduğu klasörün yolu PATH sistem değişkeni içerisine eklenecektir. Artık konsolunuz üzerinde direkt olarak composer yazarak aracı istediğiniz yerde kullanabilirsiniz.

Linux için

Öncelikle curl yardımıyla composer.phar dosyamızı indiriyoruz:

curl -sS https://getcomposer.org/installer | php

Daha sonra bu composer.phar dosyasını, Composer aracını her dizinde kullanabilmek için /usr/local/bin içerisinde taşımak için şu komutu çalıştırıyoruz:

sudo mv composer.phar /usr/local/bin/composer

Bu işlemle birlikte artık istediğiniz dizin içerisinde Composer aracını kullanabilirsiniz.

Kurulumu Doğrulama

Yaptığımız kurulumu doğrulamak için şu komutu çalıştırabilirsiniz:

composer --version

Bu komutu çalıştırdığınızda eğer çıktı olarak Composer aracının versiyon numarasını alıyorsanız kurulum başarılı bir şekilde gerçekleşmiş demektir.

Kullanımı

Kurulumumuzu başarılı bir şekilde tamamladıysak artık aracımızı kullanmaya başlayabiliriz. Ben bu yazım da sadece üçüncü parti kütüphaneleri projemize dahil etmeyi anlatacağım. Projemizin içerisinde bir kütüphane geliştirip, onu, Composer yardımıyla autoload özelliğinden faydalanarak, yine projemizin içerisinde, farklı yerde kullanmak bir sonraki yazımızın konusu olacak. Gelin şimdi bir senaryo yazalım ve onun üzerinden giderek Composer aracının çözdüğü sorunları daha iyi kavrayalım. Üzerinde çalıştığınız bir proje için bir raporlama (Logging) aracına ihtiyacınız oldu ve bunu kendiniz geliştirecek vaktiniz yok ya da geliştirmek istemiyorsunuz. O halde bunu dışarıdan kütüphane olarak alacaksınız fakat bir yandan da projenizin dosya boyunun büyümesini ya da taşınabilirliğinin zorlaşmasını istemiyorsunuz işte tam da bu noktada Composer aracı aklınıza geliyor ve şu şekilde kullanıyorsunuz:

Öncelikle konsolunuz üzerinden projenizin bulunduğu ana klasörü açıyorsunuz buradayken:

composer init

komutunu çalıştırıyorsunuz. Bu komut çalıştığında sizden projeniz ile ilgili birkaç bilgi isteyecektir. Aşağıdaki ekran görüntüsünde olduğu gibi ilgili cevapları vermeniz gerekiyor.

composer-init
composer init komutu

Burada minimum stability ile bizden istediği projeye dahil edeceğimiz kütüphanelerin en düşük hangi stabilitede olması gerektiğidir. Bu soruya hiçbir cevap vermezseniz varsayılan değer olarak stable kullanılacaktır. Konu hakkında daha fazla bilgi için: https://getcomposer.org/doc/04-schema.md#minimum-stability
Bu işlemleri tamamladığınızda proje klasörünüzde composer.json isimli bir dosyanın oluşturulduğunu göreceksiniz. Eğer açıp bakarsanız görebilirsiniz ki biraz önce cevapladığınız soruların yanıtları bu dosyada tutuluyor. Yine aynı şekilde, projenize dahil edeceğiniz kütüphaneler de isimleri ve versiyon kısıtlamaları ile bu dosya içerisinde tutulacaktır. Böylece, üçüncü parti kütüphanelerinin dosyalarını versiyon yönetim sisteminize (git, svn vb.) eklemenize ya da bu dosyalarla birlikte paylaşmanıza gerek olmayacaktır. Sadece composer.json dosyanızı versiyon yönetim sisteminize eklemeniz ve bu şekilde paylaşmanız yeterli olacaktır. Projenizi alan herkes composer install komutunu çalıştırarak gerekli kütüphaneleri kendisi için edinebilir.

Bir Kütüphaneyi Projeye Dahil Etmek

Artık Composer aracımız projemizin içerisinde kullanıma açık bir şekilde emirlerimizi beklemektedir. Hemen senaryomuza uygun olarak kendisine istediğimiz kütüphaneyi belirtelim. Ben raporlama kütüphanesi olarak Klogger isimli kütüphaneyi tercih ettim ve onu dahil edeceğim projeme şu komut ile:

composer require katzgrau/klogger

Komut çalıştırıldığında birtakım işlemler gerçekleşecek ve herhangi bir sorunla karşılaşılmadığı takdirde istediğimiz kütüphane başarılı bir şekilde projemize dahil edilmiş olacaktır. Hemen bir composer.json dosyamızı kontrol edelim bakalım neler değişmiş:

"require": {
    "katzgrau/klogger": "^1.0"
}

Gördüğünüz üzere istediğimiz kütüphane bağımlılıklarımız altına ismi ve versiyon sınırlandırma bilgisi ile eklenmiş bulunmakta. Fakat dahil ettiğimiz kütüphanenin dosyaları nerede ve nasıl kullanacağız? Bu sorunun yanıtı için hemen proje klasörümüze bakalım: vendor isimli bir klasörün oluşturulduğunu göreceksiniz, içerisini bir incelerseniz görebilirsiniz ki istediğiniz kütüphanenin dosyaları buradadır. Aynı zamanda projemize dahil edeceğiniz bütün kütüphanelerin dosyaları vendor klasörü içerisinde tutulacağını öğrenmiş oluruz. Dosyaların nerede bulunduğunu öğrendik, fakat bu dosyaları projemizde nasıl kullanacağımızı henüz bilmiyoruz hemen onu da anlatayım. vendor klasörüne baktığınızda bir de autoload.php isminde bir dosya görmüştünüz, işte tam da bu dosya yardımıyla projelerimizde kütüphaneleri kullanabileceğiz. Hemen bir index.php dosyası oluşturalım ve require_once ile bu autoload.php dosyamızı index.php dosyamıza include edelim ve sonrada dahil ettiğimiz kütüphaneyi istediğimiz gibi kullanalım.

<?php

use Katzgrau\KLogger\Logger;

require_once 'vendor/autoload.php';

$logger = new Logger(__DIR__."/logs");
$logger->info("Info example");

$errorInfo = array(
    'code' => 404,
    'message' => "Not Found"
);
$logger->error("Error example", $errorInfo);

Dahil ettiğimiz kütüphaneyi kullanmak için bu şekilde kodlarımızı yazdık. Hemen bir test edelim isterseniz. Konsolumuzda proje klasörümüzde iken:

php index.php

komutu çalıştırarak ya da localhost üzerinde çalışıyorsanız ilgili adresi tarayıcınız üzerinden açarak kodları çalıştırabilirsiniz. Çalıştırdıktan sonra tekrar proje klasörümüze bir bakalım. Göreceksiniz ki logs isminde bir klasör oluşturulmuş ve içerisinde log_2015-08-10.txt gibi bir dosya oluşturulmuş. Hemen açalım bir bakalım bu dosyanın içerisin de ne yazıyor:

[2015-08-10 12:31:52.766026] [INFO] Info example
[2015-08-10 12:31:52.766400] [ERROR] Error example
 code: 404
 message: 'Not Found'

İşte bu kadar! İstediğimiz raporlar .txt uzantılı dosyamıza yazılmış. Yani projemize dahil ettiğimiz kütüphane sorunsuz bir şekilde kullanılabiliyor. Gördüğünüz gibi Composer yardımıyla en az zahmetli şekilde projemize istediğimiz dosyaları dahil ettik.

Eklenen Kütüphanenin Versiyonunu Güncelleştirmek

Peki bu dahil ettiğimiz kütüphanelerin ileri de yeni versiyonları çıkarsa biz nasıl güncelleyeceğiz? Onu da şu şekil de çok basit bir komut ile halledebilirsiniz:

composer update

Eğer kullandığınız kütüphanelerin yeni versiyonları çıkmışsa bu komut yardımıyla çok kolay bir şekilde güncellemeleri alabilirsiniz. Tabii güncellemeleri almadan önce kullandığınız kütüphanenin changelog’unu kontrol etmekte fayda var çünkü sizin kullandığınız bir fonksiyon yeni versiyonda değiştirilmiş ya da kaldırılmış olabilir. Bu konuda dikkatli olmanız gerekmektedir.

Eklenen Kütüphaneyi Bağımlılıklardan Kaldırmak

Peki projenizde bir değişiklik yaptınız ve artık dahil etmiş olduğunuz bir kütüphaneye bağımlılığınız bulunmamakta bu durumda da dahil etmiş olduğunuz kütüphaneyi projenizden kaldırmanız gerekiyor bunu şu komut aracılığıyla gerçekleştirebiliyoruz:

composer remove katzgrau/klogger

Komutu çalıştırdığınızda belirttiğiniz kütüphane projenizden kaldırılacaktır.

composer.lock Dosyası ve Versiyon Yönetim Sistemleri

Son olarak projemizin ana klasörü içerisin de, projemize bir kütüphane dahil ettiğimiz de oluşan composer.lock dosyasından bahsetmek istiyorum. Bu dosyada, bizim kullandığımız kütüphanelerin ve onların kullandığı kütüphanelerin versiyonları gibi önemli bilgiler bulunmakta ve bu dosya sürekli güncel tutulmakta, Composer aracıyla yaptığınız hemen hemen her işlem bu dosyayı etkilemektedir. Bu nedenle versiyon yönetim sisteminize composer.lock dosyasını eklemeniz gerekiyor.

NOT: vendor klasörünü versiyon yönetim sisteminize eklemeyiniz. Zaten her geliştirici projeyi bilgisayarına aldığında composer install komutunu çalıştıracağı için vendor klasörü ve içerisindeki gerekli kütüphaneler otomatik olarak kurulacaktır. Aksi halde zaten bu aracın çözdüğü sorunu tekrar oluşturmuş olursunuz.

Require ve Require-dev Farkı

Bu iki terimin farkı şöyle bir senaryoda ortaya çıkıyor: Projenizde sadece geliştirici ekip için gerekli olan bazı kütüphaneler olabilir mesela PHPUnit bunlardan birisi, PHPUnit, uygulamanızın çalışması için gerekli bir kütüphane değil ama geliştirici ekibin birim testleri yazabilmesi için gerekli. Bu durumda işte require-dev terimi devreye giriyor ve PHPUnit gibi sadece geliştirici ekip için gerekli olan kütüphaneler buraya ekleniyor. Bunun için çalışmamız gereken komut şu:

composer require --dev phpunit/phpunit

Bu komutun ardından composer.json dosyamıza şu kısmın eklendiğini göreceğiz:

"require-dev": {
    "phpunit/phpunit": "^5.6"
}

Bu iki terimin farkını kavramak çok önemli, aksi takdirde, uygulamanızın çalışması için gerekli olmayan bağımlılıkları require kısmı içerisine eklenmesine yol açacaktır. Bağımlılık yönetimi açısından bu istemediğimiz bir durum elbette.

Packagist.org

“Her şey iyi güzel de, peki, biz bu kütüphaneleri nereden bulacağız?” diye sorduğunuzu duyar gibiyim. O halde hemen sorunuza yanıt vereyim ve sizi packagist.org adresine davet edeyim. Bu site üzerinde Composer ile edinebileceğiniz kütüphaneleri bulabilirsiniz ve yine aynı şekilde composer require [...] komutu ile projenize dahil edebilirsiniz.

Özet

Son olarak bu yazımızda neler öğrendiğimizi özetlemek istiyorum. Bu yazımız ile; Programlamada bağımlılık yönetiminin ne olduğunu, Composer aracının bu bağımlık yönetimine nasıl bir çözüm getirdiğini, Composer aracını nasıl kuracağımızı ve kullanacağımızı öğrenmiş olduk. Ayrıca bu yazımda yaptığımız örneğe ulaşmak isterseniz buraya tıklayarak ilgili Github repository’sine ulaşabilirsiniz. Composer ile ilgili anlatmadığım diğer komutlar için Compeser aracının sitesini ziyaret edip dökümantasyonunu okuyabilirsiniz.

Serinin Sonraki Yazısının Konusu

Bu serinin bir sonraki yazısını ne zaman yazarım bilemiyorum fakat konusu şimdiden belli: Projelerimizde kendimiz geliştirdiğimiz kütüphaneleri autoload sistemine nasıl ekleyebiliriz. Bu konuyu “PHP’de Composer ile Bağımlılık Yönetimi – 2” yazısında anlatacağım.

Yazı Serisi

  1. PHP’de Composer ile Bağımlılık Yönetimi(1): Üçüncü parti kütüphaneyi projeye dahil etme
  2. PHP’de Composer ile Bağımlılık Yönetimi(2): Kendi kütüphenimizi autoloading sistemine dahil etmek

Umarım faydalı bir yazı olmuştur. Bir sonraki yazımda görüşmek üzere, esenle kalın…

PHP’de Composer ile Bağımlılık Yönetimi – 1” üzerine 2 yorum

  1. çok güzel bir yazı devamını bekliyoruz. diğer yazıda da yaygın olan başka bir kütüphane örneğide verirseniz güzel olur

    Beğen

    1. Yorumunuz için teşekkürler. Elimden geldiğince erken bi’ zamanda bu yazı serisinin ikinci yazını yazmaya çalışacağım. Fakat kütüphane kullanımı örneği yazımın konusu değil ben sadece composer ile projelerinizde nasıl bağımlılık yönetimi yapabileceğini anlatıyorum. Bir kütüphaneyi composer ile kullanımının anlatılması zaten genelde github üzerindeki o kütüphanenin repository’de ya da dökümantasyon sayfasında yapılıyor. Örneğin bu yazımda anlattığım klogger isimli kütüphene’yi nasıl kullanacağınız github sayfasında açıklanmış: https://github.com/katzgrau/klogger. Composer ile projenize dahil ettikten sonra nasıl kullanacağınız ile ilgili o kütüphanenin dökümantasyonuna bakmanız gerekiyor.

      Beğen

Yorum yazmak için;