Composer: Kullanım İpuçları

Composer, PHP'de bağımlılıkları yönetmek için bir araçtır. Projemizin bağlı olduğu kütüphaneleri listelememize olanak tanır ve bunları bizim için kurar ve günceller. Şunları göstereceğiz:

  • Composer nasıl kurulur
  • yeni veya mevcut bir projede kullanımı

Kurulum

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

Windows

Resmi Composer-Setup.exe yükleyicisini kullanın.

Linux, macOS

Bu sayfadan kopyalayacağınız sadece 4 komut yeterlidir.

Ayrıca, sistem PATH'inde bulunan bir klasöre yerleştirerek, Composer genel olarak erişilebilir hale gelir:

$ mv ./composer.phar ~/bin/composer # veya /usr/local/bin/composer

Projede Kullanım

Projemizde Composer kullanmaya başlamak için yalnızca composer.json dosyasına ihtiyacımız var. Bu dosya projemizin bağımlılıklarını tanımlar ve ayrıca ek meta veriler içerebilir. Temel bir composer.json dosyası şöyle görünebilir:

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

Burada uygulamamızın (veya kütüphanemizin) nette/database paketini (paket adı kuruluş adı ve proje adından oluşur) gerektirdiğini ve ^3.0 koşuluna uyan sürümü (yani en son 3 sürümünü) istediğini söylüyoruz.

Yani projenin kökünde composer.json dosyamız var ve kurulumu başlatıyoruz:

composer update

Composer, Nette Database'i vendor/ klasörüne indirecektir. Ayrıca, tam olarak hangi kütüphane sürümlerini kurduğu hakkında bilgi içeren composer.lock dosyasını oluşturacaktır.

Composer, vendor/autoload.php dosyasını oluşturur, bunu basitçe dahil edebilir ve başka herhangi bir iş yapmadan kütüphaneleri kullanmaya başlayabiliriz:

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'da tanımlanan koşullara göre en son sürümlere güncellemek composer update komutunun sorumluluğundadır. Örneğin, "nette/database": "^3.0" bağımlılığı için en son 3.x.x sürümünü kurar, ancak 4 sürümünü kurmaz.

En son sürümü kurabilmek için composer.json dosyasındaki koşulları ö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 listelemek gerekirdi, örn.:

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

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

php composer-frontline.php

Yeni Proje Oluşturma

Nette üzerinde yeni bir proje tek bir komutla oluşturulur:

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

proje-adi olarak projeniz için dizin adını girin ve onaylayın. Composer, zaten composer.json dosyasını içeren nette/web-project deposunu GitHub'dan indirecek ve hemen ardından Nette Framework'ü indirecektir. Artık yalnızca temp/ ve log/ klasörlerine yazma izinlerini ayarlamak yeterli olmalı ve proje canlanmalıdır.

Projenin hangi PHP sürümünde barındırılacağını biliyorsanız, onu ayarlamayı unutmayın.

PHP Sürümü

Composer her zaman kullandığınız PHP sürümüyle uyumlu paket sürümlerini kurar (daha doğrusu Composer'ı çalıştırırken komut satırında kullanılan PHP sürümüyle). Ancak bu muhtemelen barındırma hizmetinizin kullandığı sürümle aynı değildir. Bu nedenle, barındırmadaki PHP sürümü hakkındaki bilgiyi composer.json dosyasına eklemek çok önemlidir. Ardından yalnızca barındırma ile uyumlu paket sürümleri kurulacaktır.

Projenin örneğin PHP 8.2.3 üzerinde çalışacağını şu komutla ayarlarız:

composer config platform.php 8.2.3

Sürüm composer.json dosyasına şu şekilde 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 sayı, paketlerin hangi sürüm için kurulacağını belirlerken, ikinci sayı uygulamanın kendisinin hangi sürüm için yazıldığını söyler. Ve örneğin PhpStorm, PHP dil seviyesini buna göre ayarlar. (Elbette bu sürümlerin farklı olmasının bir anlamı yoktur, bu yüzden çift kayıt düşüncesizliktir.) Bu sürümü şu komutla ayarlarsınız:

composer require php 8.2.3 --no-update

Veya doğrudan composer.json dosyasında:

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

PHP Sürümünü Yoksayma

Paketler genellikle hem uyumlu oldukları en düşük PHP sürümünü hem de test edildikleri en yüksek sürümü belirtirler. Henüz daha yeni bir PHP sürümü kullanmayı planlıyorsanız, örneğin test amacıyla, Composer böyle bir paketi kurmayı reddedecektir. Çözüm, Composer'ın gerekli PHP sürümünün üst sınırlarını yoksaymasına neden olan --ignore-platform-req=php+ seçeneğidir.

Yanıltıcı Bildirimler

Paketleri yükseltirken veya sürüm numaralarını değiştirirken çakışmalar meydana gelebilir. Bir paket, başka bir paketle çelişen gereksinimlere sahip olabilir vb. Ancak Composer bazen yanıltıcı bildirimler yazdırır. Gerçekte var olmayan bir çakışma bildirir. Bu durumda, composer.lock dosyasını silmek ve tekrar denemek yardımcı olur.

Hata mesajı devam ederse, ciddiye alınmalı ve neyin nasıl ayarlanacağını anlamak için okunmalıdır.

Packagist.org – Merkezi Depo

Packagist, Composer'ın aksi belirtilmedikçe paketleri aramaya çalıştığı ana depodur. Burada kendi paketlerimizi de yayınlayabiliriz.

Merkezi Depoyu Kullanmak İstemezsek Ne Olur?

Şirket içi uygulamalarımız varsa ve bunları kamuya açık olarak barındıramıyorsak, onlar için bir şirket deposu oluştururuz.

Depolar hakkında daha fazla bilgi resmi belgelerde.

Otomatik Yükleme (Autoloading)

Composer'ın temel bir özelliği, kurduğu tüm sınıflar için otomatik yükleme sağlamasıdır; bunu vendor/autoload.php dosyasını dahil ederek başlatırsınız.

Ancak, Composer'ı vendor klasörü dışındaki diğer sınıfları yüklemek için de kullanmak mümkündür. İlk seçenek, Composer'ın tanımlanmış klasörleri ve alt klasörleri taramasını, tüm sınıfları bulmasını ve bunları otomatik yükleyiciye dahil etmesini sağlamaktır. Bunu composer.json'da autoload > classmap ayarlayarak başarırsınız:

{
	"autoload": {
		"classmap": [
			"src/",      # src/ klasörünü ve alt klasörlerini dahil eder
		]
	}
}

Ardından, her değişiklikte composer dumpautoload komutunu çalıştırmak ve otomatik yükleme tablolarını yeniden oluşturmak gerekir. Bu son derece zahmetlidir ve bu görevi aynı işlemi arka planda otomatik olarak ve çok daha hızlı gerçekleştiren RobotLoader'a devretmek çok daha iyidir.

İkinci seçenek PSR-4'e uymaktır. Basitçe ifade etmek gerekirse, bu, 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, yani örn. App\Core\RouterFactory, /path/to/App/Core/RouterFactory.php dosyasında olacaktır. Yapılandırma örneği:

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

Davranışın tam olarak nasıl yapılandırılacağını Composer belgelerinde öğrenebilirsiniz.

Yeni Sürümleri Test Etme

Bir paketin yeni bir geliştirme sürümünü test etmek istiyorsunuz. Nasıl yapılır? Öncelikle composer.json dosyasına, paketlerin geliştirme sürümlerinin kurulmasına izin veren, ancak yalnızca gereksinimleri karşılayan kararlı sürüm kombinasyonu yoksa buna başvuran şu çift seçeneği ekleyin:

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

Ayrıca composer.lock dosyasını silmenizi öneririz, bazen Composer anlaşılmaz bir şekilde kurulumu reddeder ve bu sorunu çözer.

Diyelim ki paket nette/utils ve yeni sürümün numarası 4.0. Şu komutla kurarsınız:

composer require nette/utils:4.0.x-dev

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

composer require nette/utils:4.0.0-RC2

Ancak kütüphaneye daha eski bir sürüme kilitlenmiş başka bir paket bağlıysa (örn. ^3.1), o zaman paketi yeni sürümle çalışacak şekilde güncellemek idealdir. Ancak yalnızca kısıtlamayı aşmak ve Composer'ı geliştirme sürümünü kurmaya ve daha eski bir sürüm (örn. 3.1.6) gibi davranmaya zorlamak istiyorsanız, as anahtar kelimesini kullanabilirsiniz:

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

Komutları Çağırma

Composer aracılığıyla, sanki yerel Composer komutlarıymış gibi kendi önceden hazırlanmış komutlarınızı ve betiklerinizi çağırabilirsiniz. vendor/bin klasöründe bulunan betikler için bu klasörü belirtmeye gerek yoktur.

Örnek olarak, composer.json dosyasında Nette Tester kullanarak testleri çalıştıran bir betik tanımlayalım:

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

Testleri daha sonra composer tester kullanarak çalıştırırız. Komutu, projenin kök klasöründe olmasak bile, bazı alt dizinlerde olsak bile çağırabiliriz.

Teşekkür Gönderin

Size açık kaynak yazarlarını memnun edecek bir numara göstereceğiz. Projenizin kullandığı kütüphanelere GitHub'da basit bir şekilde yıldız verebilirsiniz. Sadece symfony/thanks kütüphanesini kurmanız yeterlidir:

composer global require symfony/thanks

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

composer thanks

Deneyin!

Yapılandırma

Composer, Git sürüm kontrol aracıyla yakından bağlantılıdır. Eğer kurulu değilse, Composer'a onu kullanmamasını söylemeniz gerekir:

composer -g config preferred-install dist