Composer, vlastní knihovny a autoloading – best practice

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
chikeet
Člen | 160
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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…

chikeet
Člen | 160
+
0
-

@matej21: s něčím podobným jsem počítala, snad se s tím nějak poperu :-)

@castamir: díky, pěkná inspirace. V podstatě se snažím vytvořit taky takový sandbox a potřebuju si utřídit, co a jak.

Filip Procházka
Moderator | 4668
+
0
-

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.