Composer Kullanım İpuçları

Composer, PHP'de bağımlılık yönetimi için bir araçtır. Projenizin bağımlı olduğu kütüphaneleri bildirmenizi sağlar, onları sizin için kurar ve günceller. Şunları öğreneceğiz:

  • Composer nasıl kurulur
  • yeni ya da var olan bir projede nasıl kullanılır

Kurulum

Composer, indirip aşağıdaki gibi kuracağınız çalıştırılabilir bir .phar dosyasıdır.

Windows

Resmi kurulum programını kullanın: Composer-Setup.exe.

Linux, macOS

Tek gereken, bu sayfadan kopyalayabileceğiniz 4 komut.

Ayrıca, sistemin PATH değişkeninde bulunan bir klasöre kopyalayarak Composer'ı her yerden erişilebilir kılabilirsiniz:

$ mv ./composer.phar ~/bin/composer # ya da /usr/local/bin/composer

Projede Kullanım

Projenizde Composer kullanmaya başlamak için tek gereken bir composer.json dosyasıdır. Bu dosya projenizin bağımlılıklarını anlatır ve başka meta veriler de içerebilir. En basit composer.json şöyle görünebilir:

{
	"require": {
		"nette/database": "^3.0"
	}
}

Burada, uygulamamızın (ya da kütüphanemizin) nette/database paketini gerektirdiğini (paket adı bir üretici adı ile projenin adından oluşur) ve ^3.0 sürüm kısıtına uyan bir sürüm istediğini (yani en son 3 sürümünü) söylüyoruz.

composer.json dosyası proje kökündeyken şunu çalıştırın:

composer update

Composer, Nette Database paketini vendor/ dizinine indirir. Ayrıca, tam olarak hangi kütüphane sürümlerini kurduğuna dair bilgi içeren bir composer.lock dosyası oluşturur.

Composer bir vendor/autoload.php dosyası üretir. Bu dosyayı basitçe dahil edip kütüphanelerin sınıflarını fazladan hiçbir iş yapmadan kullanmaya başlayabilirsiniz:

require __DIR__ . '/vendor/autoload.php';

$db = new Nette\Database\Connection('sqlite::memory:');

Paketleri En Son Sürümlere Güncelleme

Kullanılan kütüphaneleri, composer.json içinde tanımlı kısıtlara göre en son sürümlere güncellemek için composer update komutunu kullanın. Örneğin "nette/database": "^3.0" bağımlılığıyla en son 3.x.x sürümünü kurar, ama 4 sürümünü kurmaz.

composer.json dosyasındaki kısıtları, en son sürümün kurulmasına izin verecek şekilde örneğin "nette/database": "^4.1" olarak güncellemek için composer require nette/database komutunu kullanın.

Kullanılan tüm Nette paketlerini güncellemek için hepsini komut satırında saymanız gerekirdi, örneğin:

composer require nette/application nette/forms latte/latte tracy/tracy ...

Bu pratik değil. Bu yüzden bunu sizin için yapan basit Composer Frontline betiğini kullanın:

php composer-frontline.php

Yeni Proje Oluşturma

Tek bir komutla yeni bir Nette projesi oluşturabilirsiniz:

composer create-project nette/web-project projenin-adi

projenin-adi yerine projeniz için kullanacağınız dizin adını yazın ve komutu çalıştırın. Composer, GitHub'dan nette/web-project deposunu indirir; bu depo zaten bir composer.json dosyası içerir. Ardından Nette Framework'ün kendisini kurar. Geriye yalnızca temp/ ve log/ dizinleri için dizin izinlerini ayarlamak kalır ve proje çalışır durumda olur.

Projenizin hangi PHP sürümünde barındırılacağını biliyorsanız, bunu mutlaka ayarlayın.

PHP Sürümü

Composer her zaman, o an kullandığınız PHP sürümüyle (daha kesin olarak, Composer çalıştırılırken komut satırında kullanılan PHP sürümüyle) uyumlu paket sürümlerini kurar. Bu, web barındırıcınızın kullandığı sürümle aynı olmayabilir. Bu yüzden barındırmanızdaki PHP sürümü bilgisini composer.json dosyasına eklemek çok önemlidir. Böylece yalnızca barındırmayla uyumlu paket sürümleri kurulur.

Örneğin projenin PHP 8.2.3 üzerinde çalışacağını belirtmek için şu komutu kullanın:

composer config platform.php 8.2.3

Sürüm composer.json dosyasına şöyle yazılır:

{
	"config": {
		"platform": {
			"php": "8.2.3"
		}
	}
}

Ancak PHP sürüm numarası dosyanın başka bir yerinde, require bölümünde de belirtilir. İlk numara paketlerin hangi sürüme göre kurulacağını belirlerken, ikinci numara uygulamanın kendisinin hangi sürüm için yazıldığını gösterir. Örneğin PhpStorm bunu PHP language level ayarını belirlemek için kullanır. (Elbette bu sürümlerin farklı olması anlamlı değildir, dolayısıyla çift kayıt bir gözden kaçmadır.) Bu sürümü şu komutla ayarlayın:

composer require php 8.2.3 --no-update

Ya da doğrudan composer.json dosyasında:

{
	"require": {
		"php": "8.2.3"
	}
}

PHP Sürümünü Yok Sayma

Paketler genellikle hem uyumlu oldukları en düşük PHP sürümünü hem de karşı test edildikleri en yüksek sürümü belirtir. Belki test amacıyla daha da yeni bir PHP sürümü kullanmak isterseniz, Composer böyle bir paketi kurmayı reddeder. Çözüm, Composer'ın gereken PHP sürümünün üst sınırlarını yok saymasını sağlayan --ignore-platform-req=php+ seçeneğidir.

Yanlış Bildirimler

Paketleri yükseltirken ya da sürüm numaralarını değiştirirken bazen çakışmalar olur. Bir paketin gereksinimleri bir başkasıyla çakışır vb. Ancak Composer bazen yanlış bildirimler verir. Aslında var olmayan bir çakışmayı bildirir. Böyle durumlarda composer.lock dosyasını silip yeniden denemek işe yarayabilir.

Hata mesajı yine de sürerse, gerçektir; ne değiştirmeniz gerektiğini ve nasıl yapacağınızı anlamak için okumalısınız.

Packagist.org – Genel Depo

Packagist, Composer'ın paketleri varsayılan olarak aradığı ana depodur. Kendi paketlerinizi de burada yayımlayabilirsiniz.

Ya Merkezi Depoyu İstemiyorsak

Şirketimiz içinde herkese açık barındırılamayacak iç uygulamalarımız ya da kütüphanelerimiz varsa, onlar için kendi depolarımızı oluşturabiliriz.

Depolar hakkında daha fazlasını resmi belgelerde okuyun.

Autoloading

Composer'ın temel özelliklerinden biri, kurduğu tüm sınıflar için autoloading sağlamasıdır. Bunu vendor/autoload.php dosyasını dahil ederek etkinleştirirsiniz.

Ancak Composer'ı, vendor/ dizininin dışındaki başka sınıfları yüklemek için de kullanabilirsiniz. İlk seçenek, Composer'ın tanımlanan dizinleri ve alt dizinlerini taramasını, tüm sınıfları bulup autoloader'a katmasını sağlamaktır. Bunun için composer.json içinde autoload > classmap ayarını yapın:

{
	"autoload": {
		"classmap": [
			"src/",      # src/ dizinini ve alt dizinlerini kapsar
		]
	}
}

Sonrasında, autoloading tablolarını yeniden üretmek için her değişiklikten sonra composer dumpautoload komutunu çalıştırmanız gerekir. Bu son derece elverişsizdir. Bu işi, aynı işi arka planda otomatik olarak ve çok daha hızlı yapan RobotLoader aracına bırakmak çok daha iyidir.

İkinci seçenek, PSR-4 standardına uymaktır. Basitçe söylemek gerekirse, isim alanlarının ve sınıf adlarının dizin yapısına ve dosya adlarına karşılık geldiği bir sistemdir; örneğin App\Core\RouterFactory sınıfı /path/to/App/Core/RouterFactory.php dosyasında bulunur. Yapılandırma örneği:

{
	"autoload": {
		"psr-4": {
			"App\\": "app/"   # App\ isim alanı app/ dizinindedir
		}
	}
}

Bu davranışı nasıl yapılandıracağınızın ayrıntıları için Composer belgelerine bakın.

Yeni Sürümleri Deneme

Bir paketin yeni geliştirme sürümünü denemek mi istiyorsunuz? İşte nasıl yapılacağı. Önce composer.json dosyanıza şu iki seçeneği ekleyin. Bu, geliştirme sürümlerinin kurulmasına izin verir; ancak Composer bunlara yalnızca kararlı sürümlerden hiçbir bileşim gereksinimleri karşılamıyorsa başvurur:

{
	"minimum-stability": "dev",
	"prefer-stable": true,
}

Ayrıca composer.lock dosyasını silmenizi öneririz; çünkü Composer bazen anlaşılmaz biçimde kurulumu reddeder ve bu, sorunu çözebilir.

Diyelim ki paket nette/utils ve yeni sürüm 4.0. Şu komutla kurun:

composer require nette/utils:4.0.x-dev

Ya da belirli bir sürümü, örneğin 4.0.0-RC2 sürümünü kurabilirsiniz:

composer require nette/utils:4.0.0-RC2

Ancak başka bir paket bu kütüphaneye bağımlıysa ve daha eski bir sürüme kilitliyse (örneğin ^3.1), ideal çözüm o bağımlı paketi yeni sürümle çalışacak şekilde güncellemektir. Yalnızca kısıtı aşmak ve Composer'ı, geliştirme sürümünü daha eski bir sürümmüş gibi (örneğin 3.1.6) göstererek kurmaya zorlamak istiyorsanız as anahtar sözcüğünü kullanabilirsiniz:

composer require nette/utils "4.0.x-dev as 3.1.6"

Komut Çağırma

Kendi önceden tanımlanmış komutlarınızı ve betiklerinizi, Composer'ın yerleşik komutlarıymış gibi Composer üzerinden çağırabilirsiniz. vendor/bin dizinindeki betikler için bu yolu belirtmeniz gerekmez.

Örnek olarak, composer.json içinde testleri çalıştırmak üzere Nette Tester kullanan bir betik tanımlayalım:

{
	"scripts": {
		"tester": "tester tests -s"
	}
}

Testleri sonra composer tester ile çalıştırırız. Komutu, projenin kök dizininde değil de alt dizinlerinden birindeyken bile çağırabilirsiniz.

Teşekkür Gönderin

Açık kaynak yazarlarını sevindirecek bir numara gösterelim. Projenizin kullandığı kütüphanelere GitHub'da kolayca yıldız verebilirsiniz. Yalnızca symfony/thanks kütüphanesini kurun:

composer global require symfony/thanks

Ve sonra çalıştırın:

composer thanks

Deneyin!

Yapılandırma

Composer, sürüm denetimi aracı Git ile sıkı sıkıya bütünleşiktir. Git kurulu değilse, Composer'a onu kullanmamasını söylemeniz gerekir:

composer -g config preferred-install dist