Composer, vlastní knihovny a autoloading – best practice
- chikeet
- Člen | 160
Zdravím, začínám s Composerem a potřebuju se trochu zorientovat v nastavení autoloadingu a v umístění vlastních knihoven. Mám svůj projekt postavený na Nette (dejme tomu MyCore), který využívám při vývoji dalších projektů. Kopírovat ho a udržovat pak X kopií mi přijde nešikovné a zbytečné, takže ho chci přidávat jako závislost Composerem.
MyCore má v závislostech Nette, takže pokud to chápu správně, Nette už pak není potřeba definovat jako závislost dalším projektům postaveným na MyCore. Bude něčemu vadit, když ho třeba zapomenu z těch závislostí smazat? Co přesně se v takovém případě stane? Jde mi hlavně o skryté problémy, na které třeba přijdu až za dlouho a nebude snadné přijít na to, co je špatně.
Další věc, která mě zajímá, je autoloading. Jak to nejlíp provést, aby se autoloader Composeru nebil s RobotLoaderem? Ze kterých složek má v takovém případě RobotLoader načítat? Nejsem si úplně jistá, jak to funguje při výchozím nastavení ze sandboxu:
<?php
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../vendor/others')
->register();
?>
Chápu správně, že Composer provádí autoloading obsahu složky vendor kromě složky vendor/others, o kterou se stará RobotLoader? Je třeba nastavení RobotLoaderu při použití Composeru nějak upravovat, nebo aktuální defaultní konfigurace ničemu nevadí a už se v ní s Composerem vlastně počítá? A co složka vendor/others, tu Composer ignoruje, i když je ve vendor? Nebylo by lepší strčit svoje třídy v projektu třeba do libs (nebo jinam, prostě mimo vendor)?
Budu ráda za jakékoliv osvětlení, když už to dělám, tak to chci dělat pořádně.
- David Matějka
- Moderator | 6445
Bude něčemu vadit, když ho třeba zapomenu z těch závislostí smazat?
v zasade to nevadi. ale muze nastat problem, pokud dojde k nejake kolizi ve verzich – tedy v MyCore budes vyzadovat treba nette 2.1 a aplikace 2.0. nemelo by ale dojit k nejakym skrytym problemum, kdyz se neco composeru nelibi, tak to rekne :)
K tomu, co nacita composer:
(skoro) kazdy balicek, ktery composer nainstaluje ma ve svem composer.json
souboru informace, jak a co ma autoloadovat. Muze to byt treba classmap,
coz funguje podobnym zpusobem jako robot loader, nebo treba psr-0 autoloading,
kde musi adresarova struktura odpovidat namespacum – trida
Kdyby\Doctrine\EntityManager
se bude hledat v souboru
src/Kdyby/Doctrine/EntityManager.php
atd. Composer tedy nema pod
kontrolou celou slozku vendor, ale jen to, co jednotlive balicky ve svem
composer.json reknou.
slozka /vendor/others je trochu wtf :) ja ji nepouzivam, pokud neco neni pod kontrolou composeru, davam to vetsinou do app/libs a robot loader se mi stara pouze o slozku app. Nekdo tyto tridy/knihovny, o ktere se nestara composer, dava do libs slozky – pak je ale nutne robot loaderu upravit pravidla, jake slozky ma skenovat.
composer a robotloader spolu budou fungovat bez problemu – pokud se nepovede nacist tridu jednim autoloaderem, zkusi se dalsi…
Editoval matej21 (22. 3. 2014 1:22)
- Filip Procházka
- Moderator | 4668
Jen doplním, vendor/others
je obskurdita co vymyslel David a
celou dobu mu všichni říkají že je to blbost. Má to jistou logiku v tom,
že ve složce vendor/ máš potom všechny externí knihovny, ale je to
strašně matoucí a spíš to dělá problémy než užitek.
Složku vendor/others
smaž a udělej si místo ní třeba
libs/
do které ostatně můžeš dávat i svoje zdrojáky
aplikace, ke kterým nemáš composer balíček.
Stejně tak bych smazal tu složku z robotloaderu a dal tam tu novou.
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
- chikeet
- Člen | 160
Díky za objasnění :-)
Ještě mě napadá jedna otázka: Je v pořádku (z pohledu logické struktury), aby knihovny stahované přes Composer obsahovaly i presentery a jejich šablony? Tzn. není bad practice mít presentery/šablony i mimo app/presenters (app/templates)? (Konkrétně mám na mysli například nějaké základní presentery pro administraci uživatelů, oprávnění apod…)
Editoval chikeet (23. 3. 2014 16:14)
- David Matějka
- Moderator | 6445
Je to v poradku, ale muze to byt slozitejsi – mozna narazis na problemy s tim, kde (v jakych namespacech) bude presenter factory hledat ty presentery…
- castamir
- Člen | 629
Pro načítání můžeš využít jen composer (přidej si do classmap cestu do složky app a do složky vendor/others (doporučuju však místo toho použít složku libs).
Já však osobně robotloader ještě používám a to tak, že má vendor složka je pojmenována jako libs/composer a robotloader mi načítá složku app a složku libs (kromě právě libs/composer) viz můj sandbox na githubu. Přijde mi nejpřehlednější. Nutno však podotknout, že v poslední době mi i tak composer vytváří prázdnou složku vendor (trošku wtf), ale to je jen malichernej problém…
- Filip Procházka
- Moderator | 4668
Co se týče presenterů, nevidím v tom problém. Jediné co musíš udělat tak zařídit aby PresenterFactory věděl v jakých namespacech máš presentery, na to slouži metoda setMapping
@castamir zbytečně to komplikuješ, na composer se používá složka vendor/ a neexistuje žádný logický důvod to měnit.