Composer
Composer je nástroj pro správu závislostí v PHP. Umožní nám vyjmenovat knihovny, na kterých náš projekt závisí, a bude je za nás instalovat a aktualizovat. Ukážeme si:
- jak Composer nainstalovat
- jeho použití v novém či stávajícím projektu
Instalace
Composer je spustitelný .phar
soubor, který si stáhnete a nainstalujete následujícím způsobem:
Windows
Použijte oficiální instalátor Composer-Setup.exe.
Linux, macOS
Stačí 4 příkazy, které si zkopírujte z této stránky.
Dále vložením do složky, která je v systémovém PATH
, se stane Composer přístupný globálně:
$ mv ./composer.phar ~/bin/composer # nebo /usr/local/bin/composer
Použití v existujícím projektu
Abychom mohli ve svém projektu začít používat Composer, potřebujete pouze soubor composer.json
. Ten popisuje
závislosti našeho projektu a může také obsahovat další metadata. Základní composer.json
tedy může
vypadat takto:
{
"require": {
"nette/database": "^3.0"
}
}
Říkáme zde, že naše aplikace (nebo knihovna) vyžaduje balíček nette/database
(název balíčku se skládá
z názvu organizace a názvu projektu) a chce verzi, která odpovídá podmínce ^3.0
(tj. nejnovější
verzi 3).
Máme tedy v kořenu projektu soubor composer.json
a spustíme instalaci:
composer update
Composer stáhne Nette Database do složky vendor/
. Dále vytvoří soubor composer.lock
, který
obsahuje informace o tom, které verze knihoven přesně nainstaloval.
Composer vygeneruje soubor vendor/autoload.php
, který můžeme jednoduše zainkludovat a začít používat
knihovny bez jakékoli další práce:
require __DIR__ . '/vendor/autoload.php';
$db = new Nette\Database\Connection('sqlite::memory:');
Aktualizace na nejnovější verze
Aktualizaci použiváných knihoven na nejnovější verze podle podmínek definovaných v composer.json
má na
starosti příkaz composer update
. Např. u závislosti "nette/database": "^3.0"
nainstaluje
nejnovější verzi 3.x.x, ale nikoliv už verzi 4.
Pro aktualizaci podmínek v souboru composer.json
například na "nette/database": "^4.1"
, aby bylo
možné nainstalovat nejnovější verzi, použijte příkaz composer require nette/database
.
Pro aktualizaci všech používaných balíčků Nette by bylo nutné je všechny v příkazové řádce vyjmenovat, např.:
composer require nette/application nette/forms latte/latte tracy/tracy ...
Což je nepraktické. Použijte proto jednoduchý skript Composer Frontline, který to udělá za vás:
php composer-frontline.php
Vytvoření nového projektu
Nový projekt na Nette vytvoříte pomocí jediného příkazu:
composer create-project nette/web-project nazev-projektu
Jako nazev-projektu
vložte název adresáře pro svůj projekt a potvrďte. Composer stáhne repozitář
nette/web-project
z GitHubu, který už obsahuje soubor composer.json
, a hned potom Nette Framework.
Mělo by již stačit pouze nastavit oprávnění na zápis do
složek temp/
a log/
a projekt by měl ožít.
Verze PHP
Composer vždy instaluje ty verze balíčků, které jsou kompatibilní s verzí PHP, kterou právě používáte. Což ovšem
nemusí být stejná verze, jako používá váš hosting. Proto je užitečné si do souboru composer.json
přidat
informaci o verzi PHP na hostingu a poté se budou instalovat pouze verze balíčků s hostingem kompatibilní:
{
"require": {
...
},
"config": {
"platform": {
"php": "7.2" # verze PHP na hostingu
}
}
}
Packagist.org – centrální repozitář
Packagist je hlavní repozitář, ve kterém se Composer snaží vyhledávat balíčky, pokud mu neřekneme jinak. Můžeme zde publikovat i vlastní balíčky.
Co když nechceme používat centrální repozitář?
Pokud máme vnitrofiremní aplikace, které zkrátka nemůžeme hostovat veřejně, tak si pro ně vytvoříme firemní repozitář.
Více na téma repozitářů v oficiální dokumentaci.
Autoloading
Zásadní vlastností Composeru je, že poskytuje autoloading pro všechny jím nainstalované třídy, který nastartujete
includováním souboru vendor/autoload.php
.
Nicméně je možné používat Composer i pro načítání dalších tříd i mimo složku vendor
. První
možností je nechat Composer prohledat definované složky a podsložky, najít všechny třídy a zahrnout je do autoloaderu.
Toho docílíte nastavením autoload > classmap
v composer.json
:
{
"autoload": {
"classmap": [
"src/", # zahrne složku src/ a její podsložky
]
}
}
Následně je potřeba při každé změně spustit příkaz composer dumpautoload
a nechat autoloadovací tabulky
přegenerovat. To je nesmírně nepohodlné a daleko lepší je tento úkol svěřit RobotLoaderu, který stejnou činnost provádí automaticky na pozadí a mnohem rychleji.
Druhou možností je dodržovat PSR-4. Zjednodušeně řečeno jde o systém,
kdy jmenné prostory a názvy tříd odpovídají adresářové struktuře a názvům souborů, tedy např.
App\Router\RouterFactory
bude v souboru /path/to/App/Router/RouterFactory.php
. Příklad
konfigurace:
{
"autoload": {
"psr-4": {
"App\\": "app/" # jmenný prostor App\ je v adresáři app/
}
}
}
Jak přesně chování nakonfigurovat se dozvíte v dokumentaci Composeru.
Volání příkazů
Přes Composer lze volat vlastní předpřipravené příkazy a skripty, jako by šlo o nativní příkazy Composeru.
U skriptů, které se nacházejí ve složce vendor/bin
, není potřeba tuto složku uvádět.
Jako příklad si definujeme v souboru composer.json
skript, který pomocí Nette Testeru spustí testy:
{
"scripts": {
"tester": "tester tests -s"
}
}
Testy pak spustíme pomocí composer tester
. Příkaz můžeme zavolat i v případě, že nejsme v kořenové
složce projektu, ale v některém podadresáři.
Konfigurace
Composer je úzce propojený s verzovacím nástrojem Git. Pokud jej nemáte nainstalovaný, je třeba Composeru říct, aby jej nepoužíval:
composer -g config preferred-install dist