Genesis: Efektivní build PHP aplikací

Dlouhá léta jsem hledal efektivní cestu, jak buildovat složitější aplikace. Na straně Javascriptu se mi před časem zalíbil Gulp, který klade kód nad konfiguraci, což je flexibilnější a přehlednější, než konfigurace, kterou vyznává například Grunt.

V PHP byl dlouho hegemonem Phing. Ten mi ovšem z mnoha důvodů nikdy nevyhovoval, i proto, že jde o nástroj, který svými možnostmi ustrnul hluboko v minulé dekádě. Například konfigurace v XML je čirý masochismus. A zápisy běžných jazykových statementů jako if, try-catch, apod., do jakéhokoliv dokumentu, nebudou nikdy tak efektivní, jako vyjádření přímo v kódu. Vyzkoušel jsem i pár dalších nástrojů, například TaskPHP, ale nepokrývaly mé potřeby.

Pohrával jsem i s myšlenkou, že bych pro build PHP použil Gulp, nebo něco z ekosystému Javascriptu, ale v okamžiku, kdy build potřebuje použivat struktury v PHP, tak by to nefungovalo. Nezbylo, než si napsat vlastní tool: Genesis.

Genesis

Genesis se skládá jen z několika tříd a snaží se stát na jednoduchosti – build je vyjádřen přímo (viz níže). Jde o třídu, která má libovolné množství tasků = public metod runXyz(). Což přináší výhodu plného využití objektového návrhu – dědičnost, kompozici, apod. Jaká třída se pro build použije si zvolíte v konfiguraci, pouze musí implementovat jednoduché rozhraní Genesis\IBuild.

Samotný příkaz v CLI je jednoduchý:

např. tedy:

Zavolá v build třídě metodu runInit(), přičemž argumenty ‘init’ a ‘dev’ se předají také a je možné s nimi pracovat.

Lze použít parametr ‘–working-dir’, který umožní spustit build v jiném, než aktuálním adresáři. V konfiguračním kontejneru je vždy dostupná proměnná ‘workingDirectory’, která je vždy naplněná cestou k aktuálnímu pracovnímu adresáři.

Sestavování aplikace obnáší spoustu úkolů, kde je nejlepší využít proměnné, protože například seznam adresářů k vytvoření, nebo cestu k executable PHPUnitu nechceme mít natvrdo zadrátovanou v kódu. Pro uložení konfigurace se pro jeho jednoduchost používá formát neon, známý z Nette Frameworku, přičemž podporuje proměnné, podobně jako v Nette.

Ukázkový jednoduchý build

Build potřebuje vlastně jen dvě věci: třídu se samotným buildem a konfigurační soubor.

config.neon

Build.php

Volitelně může být v pracovním adresáři soubor bootstrap.php, který se dá použít k zajištění autoloadingu, integraci s vaší aplikací (o tom dále), nebo k čemukoliv jinému. Aktuální example na Githubu.

Integrace s PHP aplikací a jejími službami

U složitějších aplikací je nezbytné, aby se buildovací proces dostal k některým službám z aplikace. Například v Nette Framework si v DI kontejneru vytvoříte databázové spojení, které bude build také potřebovat.

Pokud bootstrap.php z pracovního adresáře buildu vrátí instanci třídy Genesis\Config\Container, tak se spojí s obsahem kontejneru generovaného ze souboru config.neon.

Pokud vás nástroj zaujal, můžete si ho snadno vyzkoušet. Na Githubu je example project a vyzkoušení je otázka několika příkazů během pár sekund.

Zveřejněno 18.4.2016 v rubrice Programování a vývoj se štítky , , , , .
bisek

Adam Bísek

Adam se vývoji webových aplikací věnuje od roku 2002. Vyzkoušel různé technologie, ale dlouhodobě se zabývá server-side aplikacemi, převážně v PHP s použitím Nette a Symfony, dále Continuos Integration procesem a deploymentem aplikací. Tíhne k jednoduchým a čistým řešením, namísto zbytečných obstrukcí. V poslední době mu učaroval i development kolem Node.Js ekosystému.

adam.bisek@gmail.com