Composer - řešení závislostí a balíčků v PHP

(publikováno 06.10.2016) PHP, Windows, Linux

Jak na Composer včetně instalace, ukázky a použití nástroje pro správu závislostí v PHP. Využijeme také autoloader z Composeru pro načítání vlastních tříd, které vůbec nemusí být v repozitáři Packagist.

Composer - řešení závislostí a balíčků v PHP

Composer slouží k instalaci balíčků a jejich závislostí pro vývoj v PHP. Podobně funguje například npm pro NodeJS. Skoro také pip pro Python, ale ten instaluje balíčky globálně, zatímco Composer lokálně k projektu. Dají se instalovat i globálně, ale to řešit nebudeme.

O tom, jak přidat vlastní balíček do Packagist, aby jej bylo možné instalovat pomocí Composeru je zde samostatný článek.

UPDATE 11.11.2017: Doplnění informace o lokální instalaci

Instalace

Celý Composer je napsán v PHP, takže instalace pro Linux je jednoduchá. Pro Windows možná ještě jednodušší, protože existuje installer. Nejvhodnější ale asi je lokální instalace.

Lokální - preferovaná

Nevýhoda instalovaných verzí ať pro Linux (při přidání do path) či Windows je skutečnost, že jsou závislé na hlavní instalované verzi PHP. Někdy je ale instalací, a tím verzí PHP, několik. Poté je vhodné vždy určit interpreter pomocí celé cesty a využít souboru composer.phar umístěného u daného projektu.

C:/cesta_k_php/php5.6/php.exe composer.phar [...]

Windows

Stačí stáhnout Composer Installer.exe a nainstalovat. Doporučuji zvolit přidání do PATH, a na konci instalace jen uvedete cestu k php.exe, nejspíše C:\xampp\php\php.exe.

Linux

Instalace pro Linux je také velmi jednoduchá, stačí zkopírovat a vložit do příkazové řádky tyto 4 příkazy ze sekce Command-line instalation. Ve složce spuštění vám bude vytvořen soubor composer.phar. Nyní máte 2 možnosti spouštění:

# Spouštění pomocí cesty, php interpreter není nutné uvádět
/path/to/composer.phar --version
php /path/to/composer.phar --version

# Zkopírovat do path a spouštět pouze pomocí příkazu composer
sudo mv composer.phar /usr/local/bin/composer
# Nyní stačí spouštět takto
composer --version

Použití a repozitář balíčků

Repozitář pro Composer se nazývá Packagist, zde si stačí najít balíček, který chcete a nainstalujete pomocí Composeru včetně všech závislostí.

composer require mfacenet/hello-world

Composer obsahuje autoloader, takže není nutné provádět include pro všechny soubory. To dává smysl, protože balíček může mít obrovské množství závislostí, které vás vlastně ani nezajímají.

include dirname(__FILE__).'/vendor/autoload.php';

echo HelloWorld\SayHello::world();

composer.json a instalace

Pokud provedeme composer require, vytvoří se automaticky 2 soubory composer.json a composer.lock. Nebudeme se zabývat rozdíly, ale oba je dobré uložit na git a vynechat složku vendor . Na jiném PC stačí pouze nainstalovat všechny potřebné balíčky z composer souborů, podobně jako funguje package.json, o tom jsem psal v článku o Gruntu.

# Nainstaluje všechny balíčky uložené v composer.lock či composer.json
composer install

Autoload vlastních tříd mimo Packagist

Co když si napíšeme vlastní třídu, která není ve složce vendor, ale chceme pro ni využít autoloader? I toto je možné. Je nutné upravit composer.json.

{
    "require": {
        "mfacenet/hello-world": "^1.0"
    },
    "autoload": {
        "classmap": ["library/"],
        "psr-0": {
            "MojeTridy\\": "app/"
        }
    }
}

UPDATE 11.11.2017: Od publikace Resampleru na packagist již využívá namespace a proto tato ukázka platí pouze pro verzi 0.1.

Pokud například chceme načítat třídu Resampler z předchozího článku, která neobsahuje žádný namespace, umístíme ji do složky library a do autoload přidáme classmap. Poté je nutné pro přegenerování souborů composeru v příkazové řádce spustit

composer update

Pokud třídy splňují pouze starší standard PSR-0 nebo novější PSR-4, umístíme je do autoload pod dané klíčové slovo. Composer toho umí ještě více, ale to už je v dokumentaci.


V dalších článcích se zaměřím také na ukázku publikování Resampleru do Packagist. Pokud používáte Composer ještě jiným zajímavým způsobem, podělte se v komentářích.

K tomuto článku již není možné přidávat další komentáře