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. :)