Composer Kullanım İpuçları
**************************
<div class=perex>
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
</div>
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|https://getcomposer.org/Composer-Setup.exe].
Linux, macOS
------------
Tek gereken, [bu sayfadan |https://getcomposer.org/download/] kopyalayabileceğiniz 4 komut.
Ayrıca, sistemin `PATH` değişkeninde bulunan bir klasöre kopyalayarak Composer'ı her yerden erişilebilir kılabilirsiniz:
```shell
$ 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:
```js
{
"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:
```shell
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:
```php
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:
```shell
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":https://gist.github.com/dg/734bebf55cf28ad6a5de1156d3099bff betiğini kullanın:
```shell
php composer-frontline.php
```
Yeni Proje Oluşturma
====================
Tek bir komutla yeni bir Nette projesi oluşturabilirsiniz:
```shell
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 |nette:troubleshooting#Dizin İzinlerini Ayarlama] 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ü].
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:
```shell
composer config platform.php 8.2.3
```
Sürüm `composer.json` dosyasına şöyle yazılır:
```js
{
"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:
```shell
composer require php 8.2.3 --no-update
```
Ya da doğrudan `composer.json` dosyasında:
```js
{
"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 |https://packagist.org], 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 |https://getcomposer.org/doc/05-repositories.md#repositories] 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:
```js
{
"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|robot-loader:] aracına bırakmak çok daha iyidir.
İkinci seçenek, [PSR-4 |https://www.php-fig.org/psr/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:
```js
{
"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 |https://getcomposer.org/doc/04-schema.md#psr-4] 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:
```js
{
"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:
```shell
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:
```shell
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:
```shell
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 |tester:] kullanan bir betik tanımlayalım:
```js
{
"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:
```shell
composer global require symfony/thanks
```
Ve sonra çalıştırın:
```shell
composer thanks
```
Deneyin!
Yapılandırma
============
Composer, sürüm denetimi aracı [Git |https://git-scm.com] ile sıkı sıkıya bütünleşiktir. Git kurulu değilse, Composer'a onu kullanmamasını söylemeniz gerekir:
```shell
composer -g config preferred-install dist
```
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