JSifalda's blog

The simple way




Nette moduly lépe #pokračování

EDIT: Pokračování článku Nette moduly (a vlastní instalátor) #3

Po delší odmlce konceptu řešení nette modulů použitelně píšu zase. Připravuji kompletní článek, kde bych rád popsal, jak by to mohlo fungovat. Teď bych ale potřeboval poradit s následujícím:

Řešení už nenazývám modulami, protože se to pletlo. Funkce původních Nette modulů zůstává. Rozšiřuji pouze jejich schopnost distribuce (jednoduše řečeno). Balení základních funkcionalit pro aplikaci jsem po vzoru Symfony pojmenoval Bundle (nette way: Addon?). A to je také jediné, čím jsem si u nich inspiroval (yeh).

Aktuální stav řešení si můžete prohlédnout v repozitáři na Githubu.

Pomocí vlastního jednoduchého composer instalátoru Nette budles umějí od minula navíc:

  • Nikde není třeba nic registrovat
  • Podpora vlastních RouterFactory pro jednotlivé Bundles.
  • atd... (viz přechozí článek)

Nicméně teď řeším dilema - Současný instalátor funguje tak, že v composer.json přidáte závislost např. "flame-cms/doctrine-bundle": "@dev". Composer balíček vezme a překopíruje do složky app. Zdá se to jako dobrý nápad, ale má to několik "ale".

Například výše zmíněný bundle představuje základní skeleton pro Doctrine nastavení v Nette. Co když DoctrineBundle budu chtít rozšířit o svoje Entity? Do složky DoctrineBundle ve složce app si vytovřím složku Entity, kam je všechny dám. V tom není problém. Problém je ale v tom, že v rootu aplikace mám v .gitignore něco takového src/app/*Bundle. To způsobí to, že moje rozšíření se nedostane do gitu, zůstane uložené jen v mé lokální kopii. Takže co s tím?

Možných řešeních je několik:

  1. Udělat fork balíčku flame-cms/doctrine-bundle, který si přizpůsobit pro svoji app. To by ale znamenalo hodně práce a pro mojí "malou" aplikaci se to nehodí.
  2. Nepožívat Bundles installer a nechat tedy balíček ve složce libs vedle dalších závislostí. Tím zajístím to, že původní repozitář bude oddělený od aplikace. Ve složce app si pak budu moci vytvořit složku DoctrineBundle kam si budu moci dát svoje Entity. (Pokud budu mít původní balíčky v libs v git ignore nebudu muset ignorovat balíčky, které jsou ve složce app). Na tom se mi to nelíbí to, že zase budu v aplikaci vytvářet DoctrineBundle - nějakou tu pomyslnou strukturu a význam bundles se tím pádem ztrácí. A co hlavně, příjdu tím o to, že Bundle nemusím nikam registrovat.
  3. Zachovám Bundles installer ale zbavím git ignore pro bundles ve složce app. Problém je, že podle mě není hezké "kommitovat" do své aplikace závislosti. Myslím, že by měli být někde bokem. Přesto se mi tohle řešení zdá zatím jako nejlepší. Ve složce app budu mít složku DoctrineBundle kam si budu moci dát svoje entity a s klidem "zakomitovat". Co se ale stane, když si composerem aktualizuji závislosti a původní DoctrineBundle si stáhne novější verzi? V podstatě nic. Po aktualizaci vyřeším případné "konflikty" mojí a originální verzí DoctrineBundle.

Nepadá vás nějaké jiný či ideálnější způsob řešení? Nebo jaké z výše jmenovaných vám přijde nejlepší? Nemůžu se rozhodnout.

13.07.2013 at 23:50:46