Bevezetés a Phing használatába
Webes fejlesztéseink során egyszer eljön az a pont, amikor a kész weboldalt, webalkalmazást ki szeretnénk rakni egy teszt vagy éles szerverre, hogy mindenki megcsodálhassa a művünket. Ez a művelet általában több lépésből áll (forráskód felmásolása, adatbázis migráció, bizonyos szolgáltatások újraindítása), sokan nyűgnek érezhetik, illetve sok hibalehetőséget hordoz magában. Hasznos lenne, ha ezt a folyamatot nem mindig kézzel kellene elvégeznünk, hanem valahogy automatizálni tudnánk. Ebben nyújt számunkra segítséget a Phing.
A Phing
A magyarul kiejtve kissé vicces nevű alkalmazás (ejtsd ’ping’ – a szerk.) egy Apache Ant alapú PHP build eszköz, a segítségével automatizálhatjuk a webes fejlesztéseink élesítési (és egyéb folyamatait). Egy bonyolultabb webalkalmazás esetén ez a folyamat nagyon sok lépésből állhat, nézzünk pár példát:
- karbantartás oldal elhelyezése
- tesztek, kód analitikai eszközök lefuttatása az élesítendő kódon
- JavaScript és stíluslap fájlok tömörítése, egyesítése
- forráskód tömörítése, felmásolása FTP-n, SSH-n, vagy más csatornán keresztül
- forráskód kitömörítése, elhelyezése a szerveren
- adatbázis migrációk elvégzése
- karbantartás oldal eltávolítása
- szolgáltatások (webszerver, adatbázis szerver újraindítása)
A listát folytathatnánk a végtelenségig. Ha kézzel végezzük ezeket a lépéseket, az bizony elég időigényes lehet, ráadásul nagy az esélye, hogy valamit kifelejtünk, elrontunk, ami a műveletsor újrakezdésével járhat. Most nézzük, hogyan tudnánk ezt automatizálni.
Hello Phing
A Phinget PEAR-en keresztül tudjuk legegyszerűbben telepíteni, a következő parancsokkal:
pear channel-discover pear.phing.info
pear install phing/Phing
Telepítés után adjuk ki konzolból a phing
parancsot.
Amint látjuk nem történt semmi, a build.xml
fájlt hiányolja. Hozzunk létre egy test/
(vagy tetszőleges nevű) könyvtárat, benne pedig egy build.xml
fájlt, a következő tartalommal:
- <?xml version="1.0" encoding="UTF-8"?>
- <project name="HelloPhing" default="hello" basedir="." description="hello phing">
- <target name="hello">
- <echo msg="Hello Phing!" />
- </target>
- </project>
Most az újonnan létrehozott könyvtárunkban adjuk ki a phing
parancsot, aminek eredményeként a képernyőnkön a „Hello Phing!” üzenetnek kell megjelennie pár egyéb információ mellett.
A build.xml fájl
Az előzőekben létrehozott build.xml
fájl egy szabványos XML fájl, ami a Phing által végrehajtandó műveleteket tartalmazza. A műveleteket csoportokba (úgynevezett targetekbe) szervezhetjük, ezeket külön-külön is futtathatjuk, illetve egy műveletcsoport lefutását függővé tehetünk egy másiktól. A <project>
elem attribútumaként megadhatjuk a projekt nevét, egy rövid leírást, a forráskönyvtárat és a kezdő műveletcsoport nevét.
Nézzünk most egy bonyolultabb példát, amiben a következő műveleteket fogjuk elvégezni:
- lefuttatjuk a projektünk egységtesztjeit
- legeneráljuk a dokumentációt
- egy külön build könyvtárba másoljuk a forráskódot a felesleges fájlok kivételével
- FTP-n keresztül feltöltjük az alkalmazásunkat egy tárhelyre
- töröljük a folyamat során létrejött fájlokat
Lássuk, hogy fog kinézni a build.xml
-ünk:
- <?xml version="1.0" encoding="UTF-8"?>
- <project name="TestProject" default="info" basedir="." description="Phing test project">
- <property name="info" value="Phing test project" />
- <property name="src" value="src" />
- <property name="tests" value="tests" />
- <property name="docs" value="docs" />
- <property name="build" value="build" />
- <property name="ftp.host" value="test.server.hu" />
- <property name="ftp.port" value="21" />
- <property name="ftp.username" value="username" />
- <property name="ftp.password" value="password" />
- <property name="ftp.dir" value="~/www/" />
- <property name="ftp.mode" value="ascii" />
- <target name="info">
- <echo msg="${info}"/>
- </target>
- <target name="test">
- <phpunit printsummary="true" haltonfailure="true">
- <batchtest>
- <fileset dir="${tests}">
- <include name="*Test.php" />
- </fileset>
- </batchtest>
- </phpunit>
- </target>
- <target name="docs">
- <delete dir="${docs}" includeemptydirs="true" verbose="true" failonerror="true" />
- <mkdir dir="${docs}" />
- <phpdocext
- title="TestProject"
- destdir="${docs}"
- sourcecode="true"
- output="HTML:Smarty:default"
- >
- <fileset dir="${src}">
- <include name="*.php" />
- </fileset>
- </phpdocext>
- </target>
- <target name="build">
- <mkdir dir="${build}" />
- <copy todir="${build}" includeemptydirs="true">
- <fileset dir="${src}">
- <include name="*.php" />
- <exclude name=".git" />
- </fileset>
- </copy>
- </target>
- <target name="deploy">
- <ftpdeploy
- host="${ftp.host}"
- port="${ftp.port}"
- username="${ftp.username}"
- password="${ftp.password}"
- dir="${ftp.dir}"
- mode="${ftp.mode}"
- >
- <fileset dir="${build}">
- <include name="*.php" />
- </fileset>
- </ftpdeploy>
- </target>
- <target name="clean">
- <delete dir="${build}" includeemptydirs="true" verbose="true" failonerror="true" />
- </target>
- </project>
Magyarázat: A fájlunk elején definiáltunk pár tulajdonságot (<property>
), hogy a későbbiekben könnyebben tudjuk ezeket módosítani. Ezután definiáltunk hat targetet: info
, test
, docs
, build
, deploy
és clean
. A különböző targeteket a phing [targetnév]
paranccsal tudjuk futtatni, alapértelmezetten az info
target fut le, ami nem csinál mást, mint kiír egy egyszerű üzenetet. A test
target feladata, hogy a tests/
könyvtárban lévő PHPUnit teszteket lefuttassa, majd megjelenítse az eredményt. Megadtuk neki a haltonfailure
attribútumot, ami annyit tesz, hogy a futás folytatódjon-e a tesztek sikertelensége esetén is. A docs
target PHPDocumentor segítségével legenerálja a docs/
könyvtárba a dokumentációkat, a build
egy build/
nevű könyvtárat hoz létre, majd abba másolja a forrásfájljainkat, a clean
pedig törli a művelet során létrejött könyvtárat és fájlokat. Ami érdekesebb lehet, az a deploy
, ez a megadott kapcsolati adatokkal felmásolja egy FTP szerverre a build/
könyvtárban lévő fájljainkat.
A build.properties fájl
Hogy egy kicsit szebbé, illetve hordozhatóbbá tegyük a build fájlunkat, az abban található paramétereket kiemelhetjük egy külön fájlba, ami a projekt specifikus adatokat tartalmazza. Hozzunk létre egy build.properties
nevű fájlt a következő tartalommal:
info="Phing test project"
src="src"
tests="tests"
docs="docs"
build="build"
ftp.host="test.server.hu"
ftp.port="21"
ftp.username="username"
ftp.password="password"
ftp.dir="~/www/"
ftp.mode="ascii
Majd a build.xml
fájlunk elején a <property>
-ket cseréljük le erre a sorra:
- <property file="./build.properties" />
Bár nem kötelező, de sokkal elegánsabb így, hogy a projekt beállításainkat elválasztottuk a build fájlunktól, és kiemeltük egy külön állományba.
Összegzés
Összességében elmondhatjuk, hogy a Phing egy nagyon hasznos kis eszköz, egyszerűen használható, sok időt és fáradságot spórolhat meg nekünk. A segítségével automatizálhatjuk a fejlesztéseink élesítési folyamatait, érdemes kipróbálnia mindenkinek, akár sok kis, akár egy nagy projekten dolgozik. A példákban található műveletek csak egy nagyon kis része annak, amire az alkalmazás képes, érdemes szétnézni a hivatalos oldalon, illetve beleolvasni a dokumentációba: http://phing.info.
■
Egyszerűen olyan hülyén cseng
+1
:DDDD
vajon..
Gondolok itt olyasmire, hogy pl. egy alap Drupal cms, vagy mondjuk egy Zend FW2 skeleton..? (mint pl a Composer+Packager-párosnál)
Hivatalos, vagy mások által
Egyébként sok értelmét nem látom, egyrészt nagyon egyszerű egy ilyen build fájl megírása, másrészt ezek a folyamatok nagyon különbözőek lehetnek, ahhoz, hogy ilyen általános sablon fájlokat készíteni lehessen.
kis projekteknél kevésbé tűnik érdekesnek
Ennek a bejegyzésnek a célja
Szerintem abban egyetérthetünk, hogy a példában bemutatott műveletek se nem bonyolultak, se nem életszerűtlenek, ettől függetlenül vannak azért weboldalak/webalkalmazások, ahol a git-pull és a migrate.pl nem lenne elég. :)