Az utóbbi időben volt szerencsém elég sokat játszani a composerrel. Ennek tapasztalatait szeretném összeszedni. Nem célom egy teljesértékű composer leírást adni, inkább arra koncentrálok, hogy a composer.json
ban való matatás helyett mennyire jól használhatók a CLI parancsok.
Mi is az a composer?
Kezdjük Ádámtól és Évától. A composer egy dependencia menedzsment (magyarul függőség kezelő) alkalmazás PHP projektekhez. Ma már senki nem ír teljesen nulláról, csak és kizárólag saját kódból építkezve meg egy alkalmazást, de még ha így is tesz, akkor is jól teszi ha független komponensenkben, libekben gondolkozik. Egy szó mint száz, a composerrel való találkozást senki nem fogja megúszni (kivéve természetesen ha azt is megírja magának).
Telepítés, inicializálás
A composert pharban hozza a jézuska:
cd ~/FirstComposerProject
curl -sS https://getcomposer.org/installer | php
Ezt érdemes a projektünk gyökerében elvégezni és egyből hozzá is adni a repohoz (ugye senki nem dolgozik verziókövetés nélkül – még otthon magányosságában sem?).
git add composer.phar
git commit -m 'add composer'
Mivel viszonylag ritka az az eset, hogy több verzió kell a composerből ezért én tartok egyet a PATH
-on is.
sudo cp composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
Így gyorsan és fájdalommentesen egy bárhonnan futtatható composer a jutalmunk. Mint minden szoftvert a composert is fejlesztik, nem árt néha frissíteni.
sudo composer selfupdate
vagy ízlés szerint akár
sudo composer self-update
De hogy lesz ebből projekt. Hát egyszerűen, inicializálni kell. Mások ezt úgy mondanák, hogy hozz létre egy composer.json
filet és tegyél bele ezt-meg-azt. Mi azért probáljuk meg egyszerűbben.
composer init
Ilyen egyszerű. Egy interaktív felület gyönyörűen végigvezet a szükséges adatokon, szinte el sem lehet rontani. Valahogy így néz ki.
Welcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [root/first-composer-project]: my/first-project
Description []: Az elso composeres probalkozas
Author [blerou <sulik.szabolcs@example.com>]:
Minimum Stability []:
License []: MIT
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no
{
"name": "my/first-project",
"description": "Az elso composeres probalkozas",
"license": "MIT",
"authors": [
{
"name": "blerou",
"email": "sulik.szabolcs@example.com"
}
],
"require": {
}
}
Do you confirm generation [yes]? yes
A dependenciák összeválogatását kihagytam, arról később. A lényeg, hogy a végén kiírt JSON megjelenik a composer.json
ben is. Nincs más hátra, mint előre, repoba vele.
git add composer.json
git commit -m 'add composer.json'
Minden kezdet nehéz, na ez nem az.
Függőségek kezelése
El is érkeztünk a lényegi részhez. Tegyük fel, hogy egy silex alkalmazást készülünk építeni, ehhez nyilvánvalóan kelleni fog maga a silex. A composer a csomagneveket vendor/project
formában várja, valamint minden csomaghoz tartozik egy verzió is (a szemantikus verziózásra nem szeretnék kitérni elég írás van arról máshol :)). Az a szép a composerben, hogy nem kell szinte semmit fejben tartani a csomagokról, mert ő minden segítséget megad. Szóval adjuk hozzá a silexet a projektünkhöz.
composer require
Igen, ilyen egyszerű. Először rákeresünk a csomag nevére, majd kiválsztjuk, végül választunk hozzá egy verziót is (ha nem tudjuk miből választhatunk, akkor a *
a jó választás) és már települ is. Íme az eredmény:
Search for a package []: silex
Found 15 packages matching silex
[0] silex/silex
[1] yunait/level3-silex
[2] bernard/silex
[3] silex/ckan_client
[4] silex/web-profiler
[5] neutron/silex-imagine-provider
[6] neutron/silex-filesystem-provider
[7] mheap/silex-assetic
[8] mheap/silex-memcache
[9] macedigital/silex-jms-serializer
[10] fabpot/silex-skeleton
[11] jdesrosiers/silex-cors-provider
[12] jdesrosiers/silex-swagger-provider
[13] ddesrosiers/silex-annotation-provider
[14] verdet/silex-sphinxsearch
Enter package # to add, or the complete package name if it is not listed []: 0
Enter the version constraint to require []: *
Search for a package []:
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing psr/log (1.0.0)
Loading from cache
- Installing symfony/routing (v2.3.6)
Downloading: 100%
- Installing symfony/debug (v2.3.6)
Downloading: 100%
- Installing symfony/http-foundation (v2.3.6)
Downloading: 100%
- Installing symfony/event-dispatcher (v2.3.6)
Loading from cache
- Installing symfony/http-kernel (v2.3.6)
Downloading: 100%
- Installing pimple/pimple (v1.0.2)
Downloading: 100%
- Installing silex/silex (v1.1.1)
Downloading: 100%
symfony/routing suggests installing symfony/config ()
symfony/routing suggests installing symfony/yaml ()
symfony/routing suggests installing doctrine/common ()
symfony/debug suggests installing symfony/class-loader ()
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/http-kernel suggests installing symfony/browser-kit ()
symfony/http-kernel suggests installing symfony/class-loader ()
symfony/http-kernel suggests installing symfony/config ()
symfony/http-kernel suggests installing symfony/console ()
symfony/http-kernel suggests installing symfony/dependency-injection ()
symfony/http-kernel suggests installing symfony/finder ()
silex/silex suggests installing symfony/browser-kit (>=2.3,<2.5-dev)
silex/silex suggests installing symfony/css-selector (>=2.3,<2.5-dev)
silex/silex suggests installing symfony/dom-crawler (>=2.3,<2.5-dev)
silex/silex suggests installing symfony/form (>=2.3,<2.5-dev)
Writing lock file
Generating autoload files
Ha már ismerősebb a táj lehet ezt rövidebben is írni:
composer require silex/silex 1.1.1
vagy
composer require silex/silex=1.1.1
A require
parancs alkalmas arra, hogy minden, productionben is szükséges függőséget megadjunk. Azonban nem csak ilyen függőségek vannak. Vannak olyan libek, amit kifejezetten fejlesztéshez veszünk igénybe, de nem akarunk látni az éles rendszerben. Ilyen, hogy más ne mondjak a PHPUnit.
composer require --dev phpunit/phpunit 3.7.28
A fenti módszerekkel beállított függőségek gyönyörűen megjelennek a composer.json
-ban, anélkül, hogy egy ujjal is hozzányúltunk volna. Persze ha nem egyedül dolgozunk egy projekten, akkor könnyen előfordulhat, hogy más valaki vesz fel új függőseget. Ezeket nem árt telepíteni.
composer install
Ha azt szeretnénk, hogy a fejlesztéshez használatos újabb függőségek is települjenek szükség van a --dev
kapcsolóra
composer install --dev
Időnként pedig nem árt frissíteni is (ez elintéz mindenféle függőséget, korra és nemre való tekintet nélkül).
composer update
Minden require
, install
és update
után létrejön vagy frissíl egy composer.lock
file. Itt tárolja a composer az aktuális telepítés pontos verzióit (az összes függőségével együtt természetesen). Ajánlás alapján ennek is a repoban a helye.
git add composer.lock
git commit -m 'add composer.lock'
További hasznos parancsok
Előfordul, hogy nincs szükség sem telepítésre sem frissítésre, de szeretnénk újrageneráltatni az autoloadert. Ilyen eset ha át akarjuk állítani a projekt autoloaderét PSR0-ról classmap alapúra.
composer dumpautoload
vagy
composer dump-autoload
Persze elő fog fordulni, hogy kézzel kotorásszunk a composer.json
-ban. Ekkor könnyen megviccelhetnek az ott felejtett vesszők és egyéb állatok. Szerencsére leellenőrzhetjük a file egészségét.
composer validate
Itt a vége
A leírtaknál több parancsa van a composernek természetesen, de ezek a függőségkezelés szempontjából a legfontosabb, a többi szinte csak hab a tortán.
Jó szórakozást.