Letní akce! Lákají tě IT školení C#, Javy a PHP v Brně? Přihlas se a napiš nám do zpráv kód "BRNO 500" pro slevu 500 Kč na libovolný brněnský kurz. Lze kombinovat se slevami uvedenými u školení i použít pro více kurzů. Akce končí 28.7.

Composer

PHP Ostatní Composer

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Stahujete a načítáte do projektu cizí knihovny ručně? Tak s tím je navždy konec! Přivítejte Composer - nástroj pro správu PHP závislostí, který by měl znát každý PHP programátor. V tomto tutoriálu si vysvětlíme, co to ten Composer je, jak si jej nainstalovat, a jak jej používat.

Článek předpokládá, že jste se již s PHP setkali a máte jej nainstalované. Pokud ne, prostudujte si nejprve Základní konstrukce jazyka PHP.

Co je Composer?

Composer je multiplatformní nástroj pro snadnou správu závislostí v PHP. Dovoluje nám deklarovat knihovny, na kterých je náš PHP projekt závislý, a následně tyto závislosti instalovat a aktualizovat. Také můžeme definovat cesty pro automatické načítání tříd našeho projektu (autoloading) a případně si definovat zkratky ke skriptům, které nám mohou usnadnit práci při tvorbě projektu. Rovněž se pomocí Composeru zakládají nové projekty ve známých PHP frameworcích, např. takové Symfony se bez Composeru moc neobejde.

Domovskou stránkou Composeru je stránka https://getcomposer.org/, na níž je zajímavá hlavně dokumentace, na kterou v článku odkazuji.

Oficiálním repositářem PHP balíčků je Packagist, který naleznete na stránkách https://packagist.org/. Do vyhledávacího políčka stačí zadat název požadovaného balíčku nebo klíčová slova, a vybrat si nejvhodnější řešení z výsledků hledání.

Závislosti jsou pak definovány v souboru composer.json v kořenové složce našeho projektu. Jednotlivým závislostem můžeme nastavovat požadované verze a ty jsou automaticky stahovány do složky vendor.

Instalace Composeru

Composer je PHP skript zabalený do souboru composer.phar a pro svůj běh vyžaduje nainstalované PHP minimálně ve verzi 5.3.2. Dalším požadavkem může být přítomnost softwaru git, svn, fossil nebo hg v závislosti na tom, v čem jsou požadované balíčky verzované, ale na to by měl Composer v případě potřeby upozornit.

Composer lze nainstalovat lokálně nebo globálně.

  • Lokální instalace znamená, že si přidáme soubor composer.phar do kořenové složky našeho projektu jako část projektu a bude dostupný pouze tam (nejčastěji pomocí příkazu php composer.phar ...).
  • Globální instalace naopak znamená to, že máme pouze jednu kopii souboru composer.phar, používanou napříč celým systémem (nejčastěji pomocí příkazu composer ...).

Windows, globální pomocí instalátoru

Windowsáci to mají v skutku jednoduché. Stačí si stáhnout instalátor Composer-Setup.exe a nainstalovat Composer jako klasickou aplikaci. Během instalace se upraví systémová PATH, aby se dal Composer pohodlněji ovládat. Instalátor by měl automaticky najít vaši instalaci PHP (tedy cestu k souboru php.exe), ale v případě neúspěchu jej věřím zvládnete navést (Pokud používáte xampp, bude interpreter pravděpodobně v C:\xampp\php\php­.exe).

Po skončení instalace si zavřete všechny konzole (terminály), otevřete nové okno příkazového řádku a vyzkoušejte příkaz composer --version. Výsledek by měl být podobný následujícímu:

Composer version 1.5.1 2017-08-09 16:07:22

Pokud chcete, můžete si jej nainstalovat i manuálně, postup najdete na stránce https://getcomposer.org/doc/00-intro.md#….

Linux, macOS, BSD...

UNIXáci to mají též lehké, stačí k tomu 4 příkazy. Tyto příkazy vypadají následovně, ale prosím, zkopírujte si je ze stránky https://getcomposer.org/download/, nekopírujte je odsud! Obsahují totiž hash souboru composer-setup.php, který se mění při každé jeho úpravě a je to tak z bezpečnostních důvodů.

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '---hash---') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Každopádně, příkazy pomocí PHP získají soubor composer-setup.php, ověří jeho pravost, spustí jej, a následně vymažou. Výsledkem je soubor composer.phar, což je vlastně Composer samotný, který se dá ihned používat.

Pokud jej chcete globálně pro celý systém, zkopírujte soubor composer.phar do složky, ve které jsou ve vašem systému spustitelné soubory (mám na mysli konzolové programy dostupné v PATH). V mém případě (Ubuntu 16.04) se jedná o složku /usr/local/bin/, do které stačí soubor composer.phar přesunout. Abychom si zjednodušili práci, při přesouvání vynecháme příponu .phar, a v případě nedostatečných práv použijeme sudo. Příkaz vypadá následovně:

sudo mv composer.phar /usr/local/bin/composer

Composer tak můžeme používat v celém systému příkazem composer ..., například: composer --version.

Pro další čtení vás odkáži na https://getcomposer.org/download/ a https://getcomposer.org/…matically.md.

Pro oba systémy - pokud chcete Composer lokálně pro projekt, zkopírujte si soubor composer.phar do kořenové složky projektu (tam, kde máte soubor composer.json) a používejte s pomocí PHP příkazu php composer.phar ....

Súbor composer.json

Používání Composeru se poté točí okolo souboru composer.json. Ten máme v jednotlivých projektech, kde je specifikováno jaké závislosti daný projekt má. Máme zde v JSON formátu definovány údaje jako povinný název balíčku (sestává z názvu tvůrce a názvu projektu oddělených lomítkem), popis balíčku, typ balíčku, klíčová slova balíčku, licenci balíčku (např. MIT, lze definovat více licencí, balíčky s uzavřenou licencí mají hodnotu proprietary) a podobně. Všechny možnosti naleznete v oficiální dokumentaci na adrese https://getcomposer.org/…04-schema.md.

Ukažme si, jak může takový soubor composer.json vypadat. Nelekejte se složité struktury, soubor si necháváme vygenerovat pomocí příkazů, viz dále.

{
  "name": "matusko/example",
  "description": "This is example project",
  "type": "project",
  "license": "MIT",
  "keywords": [
    "example",
    "zf"
  ],
  "homepage": "https://www.example.com/",
  "minimum-stability": "dev",
  "prefer-stable": true,
  "require": {
    "php": "^5.6 || ^7.0",
    "zendframework/zend-component-installer": "^1.0 || ^0.7 || ^[email protected]",
    "zendframework/zend-mvc": "^3.0.1",
    "doctrine/doctrine-orm-module": "^1.1"
  },
  "require-dev": {
    "zendframework/zend-developer-tools": "^1.1.0",
    "zendframework/zend-test": "^3.0.1"
  },
  "autoload": {
    "psr-4": {
      "Common\\": "module/Common/src/",
      "Admin\\": "module/Admin/src/",
      "Application\\": "module/Application/src/"
    }
  },
  "autoload-dev": {
    "psr-4": {
      "ApplicationTest\\": "module/Application/test/"
    }
  }
}

Závislosti jsou definovány pod klíčem require. Pokud chceme definovat závislosti potřebné pro vývoj, můžeme je přidat pod klíčem require-dev. Jak vidíte, pro každou závislost je definována požadovaná verze. O verzích je napsáno na stránce https://getcomposer.org/…/versions.md#….

Pokud chceme využít Composer i pro autoload tříd našeho projektu, můžeme to v souboru composer.json definovat. Doporučuje se použít PSR-4, ale lze použít také PSR-0, generování mapy tříd (classmap) a vkládání souborů (files).

Při používání nástroje Composer se nám bude generovat ještě soubor composer.lock. Ten v sobě uchovává právě seznam balíčků i s jejich přesnými verzemi, a to se nám může hodit.

Základní příkazy

Composer se ovládá pomocí příkazové řádky. Všechny příkazy si můžete prohlédnout na adrese https://getcomposer.org/doc/03-cli.md. Nyní si příkazy projdeme a v další části článku si provedeme praktickou ukázku využití Composeru na konkrétním projektu.

Pro zjednodušení příkazů článek předpokládá, že máte Composer nainstalovaný globálně. Před spuštěním příkazů se musíte v příkazové řádce přesunout do složky s projektem, který chcete spravovat! Příkazovou řádku ve Windows spustíte stisknutím klávesy s logem Windows a napsáním textu "cmd", což najde program Příkazový řádek. Příkaz pro přesun do složky může ve Windows vypadat např. takto:

cd C:\Users\Matus\Dropbox\projekt

Linuxáci tyto skills jistě ovládají :)

init

Příkazem composer init je možné vygenerovat soubor composer.json. Také nás provede přes nastavení základních údajů jako název projektu, popis projektu, verze projektu, a podobně, abychom na nic podstatného nezapomněli.

install

Příkaz composer install stáhne do složky vendor balíčky definované v souboru composer.json a vygeneruje soubor composer.lock.

Pokud v projektu již soubor composer.lock máte (např. při nasazování projektu na server), příkaz composer install stáhne přesně ty verze balíčků, které jsou definovány v souboru composer.lock (a s nimiž projekt pravděpodobně funguje, protože jste s nimi projekt vyvíjeli).

require

Příkaz composer require ... je právě tím způsobem, kterým do projektu přidáte balíčky. Např. pokud chceme používat balíček phpmailer/phpma­iler, použijeme příkaz composer require phpmailer/phpmailer. Soubor composer.lock je také aktualizován.

Samozřejmě můžeme balíčky přidat ručně úpravou souboru composer.json, v tom nám nic nebrání.

update

Chcete-li aktualizovat všechny balíčky na novější verze, použijte příkaz composer update. Composer balíčky aktualizuje jen na takové verze, které odpovídají požadovaným verzím definovaným v composer.json. Soubor composer.lock je také aktualizován.

Pokud chcete aktualizovat jen nějaký konkrétní balíček na novější verzi, stačí k příkazu přidat název identifikátoru balíčku, např. pro aktualizaci balíčku [phpmailer/phpma­iler]https://­packagist.org/pac­kages/phpmailer/phpma­iler) použijete příkaz composer update phpmailer/phpmailer.

dump-autoload

Composer nám kromě správy závislostí nabízí možnost definovat cesty pro jmenné prostory. Pokud jsme si definovali například novou PSR-4 cestu k třídám, musíme zavolat příkaz composer dump-autoload, aby se vygeneroval nový soubor vendor/autoload.php. Ten budeme později potřebovat pro napojení projektu na Composer balíčky.

self-update

Composer se dokáže sám aktualizovat a to příkazem composer self-update. Jednoduše z internetu stáhne své novější já a nahradí jím sám sebe.

clear-cache

Na serveru nás může zaskočit to, že projekt i se všemi závislostmi zabírá 100MB, ale hosting vykazuje 200MB použitého místa. Nelekejte se, to si jen Composer cachuje již stáhnuté balíčky pro případ, že je budeme znovu potřebovat, ale nechceme je znovu stahovat. Cache Composeru vymažeme příkazem composer clear-cache.

diagnose

Jakmile má Composer s něčím problém, můžeme spustit příkaz composer diagnose. Může nám vypsat důležité informace o tom, kde nastala chyba.

To je pro představení příkazů vše. Pokud zde váš oblíbený chybí, napište do komentářů a já jej přidám. Následuje praktická ukázka napojení projektu na Composer.

Napojení projektu na Composer

Již víme co to ten Composer je, máme jej nainstalovaný, a známe několik užitečných příkazů. Pojďme si na praktické ukázce zkusit napojení projektu na Composer.

Vytvoříme si novou složku pro náš projekt, já jsem svůj projekt nazval composer-example, a v něm si vytvořte prázdný soubor index.php.

Abychom mohli Composer v našem projektu využívat, musíme do našeho kódu vložit soubor vendor/autoload.php, který v sobě obsahuje autoloader tříd a souborů cizích balíčků. Samotné vložení by vypadalo následovně:

<?php

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

Nette, Symfony, Zend a jiné frameworky to už mají vyřešené za nás, ale pokud máme projekt postavený na vlastním kódu, musíme si to zařídit sami. Kde však tento soubor seženeme my?

Musíme si ve složce našeho projektu vytvořit soubor composer.json. Nebudeme jej ale vytvářet ručně, použijeme příkaz composer init a vyplníme několik základních údajů, na které se nás Composer zeptá. Nezapomeňte se v příkazovém řádku přesunout do složky se svým projektem! V mém případě postup vypadal následovně:

Příkaz v terminálu – composer init

Pouze jsem jednoduše enterem potvrzoval to, co mi Composer nabídl. Výsledkem je soubor composer.json, kde je povinný název projektu, seznam autorů a prázdný objekt pro závislosti našeho projektu.

Vymysleme si třeba, že náš projekt bude potřeboval populární knihovnu PHPMailer. V dalším kroku přidáme externí balíček phpmailer/phpma­iler v poslední dostupné verzi. Jak jsem již psal výše, použijeme na to příkaz composer require ..., konkrétně:

composer require phpmailer/phpmailer

V mém terminálu se dělo následující:

Příkaz v terminálu – composer require phpmailer/phpmailer

V tomto případě se nám stáhl nový balíček do složky vendor a struktura celého našeho projektu tak vypadá následovně:

Struktura PHP projektu s Composerem a PHPMailerem

V tomto případě již máme vygenerovaný i soubor vendor/autoload.php, o kterém jsem již psal. Ten si musíme requirovat v souboru index.php a následně můžeme používat balíček phpmailer/phpma­iler. Příklad použití můžete vidět na následujícím obrázku a na konci článku máte přidaný zdrojový kód tohoto příkladu.

Ukázkový příklad použití phpmaileru

Co verzovat a co ne?

Pokud na svůj projekt používáte nějaký verzovací systém (např. git), určitě vás napadla otázka: Co mám a co nemám verzovat?

Verzovat

  • soubor composer.json - Jsou v něm definované závislosti projektu.
  • soubor composer.lock - Je generovaný automaticky při změně závislostí. Právě díky tomuto souboru si Composer pamatuje přesné verze závislostí, s kterými jste projekt vyvíjeli a používali. To je užitečné právě z toho důvodu, když si na server chcete nasadit projekt. Příkaz composer install postahuje přesně takové verze závislostí, které jsou v composer.lock uložené. Máte tak jistotu, že se nerozbily některé závislosti, kdy by vám projekt při vývoji fungoval, ale při nasazení již ne.

Neverzovat

  • složku vendor - Stahují se do ní závislosti projektu, které máte definované v souboru composer.json a není žádný důvod tyto závislosti skladovat ve vlastním repositáři.

Na závěr

Nestahujte a neaktualizujte závislosti vašich projektů ručně! Používejte Composer, ulehčí vám práci ;)


 

Stáhnout

Staženo 9x (498.53 kB)
Aplikace je včetně zdrojových kódů v jazyce php

 

 

Článek pro vás napsal Matúš Petrofčík
Avatar
Jak se ti líbí článek?
6 hlasů
Autor sa rád venuje spánku.
Aktivity (6)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!