Quantcast
Channel: Mayflower Blog » phing
Viewing all articles
Browse latest Browse all 3

Buildscripts mit PHING – Teil 2

$
0
0

Im letzten Teil wurde erklärt wie ein SVN Repository automatisch exportiert werden kann.
Diese Fortsetzung erklärt das Schreiben eigener Tasks.
Dafür werden wir alle SQL-Files im data Ordner zu einem zusammenfügen.
Der Einfachheit halber nehmen wir an, dass während der Entwicklung die einzelnen SQL-Files mit einem aufsteigend numerischen Präfix gleicher Länge versehen wurden.
Also haben wir zum Beispiel folgende Files:
001_Setup_db.sql
002_data.sql
003_TEST_data.sql

Da wir die Testdaten (003_TEST_data.sql) jedoch nicht mit ausliefern wollen schreit diese Aufgabe geradezu nach einem eigenen Task.
Hier spielt nun PHING erstmals seine Stärke gegenüber ANT aus.
Eigene Tasks werden für PHING in PHP geschrieben, wir müssen als Developer also nicht extra eine neue Sprache lernen.

Eigene Tasks können auf zwei Arten geschrieben werden.
Einmal als eigenständige Klasse, was eine Weiterverwendung außerhalb des Projektes ermöglicht oder als Inline-Script.

Für die Inline Script Möglichkeit gibt es den AdHoc Task, welcher den Code als CDATA Argument übergeben bekommt.
Ein solcher Task kann wie folgt aussehen:

<adhoc-task name="sql">
    <![CDATA[
    class Sql extends Task 
    {
        private $dir;
		
        private $outputfile;
		
	function setDir($dir)
	{
	    $this->dir = $dir;
        }
        
        function setOutputfile($file)
        {
            $this->outputfile = $file;
        }
				
        function main() 
        {
            $files = array();
            
            $outfileHandle = fopen($this->file, 'a');
            $iterator = new DirectoryIterator($this->dir);
            foreach($iterator as $fileinfo) {
                if ($fileinfo->isFile()) {
                    $filename= $fileinfo->getFilename();
                    if(0 != preg_match('/^(\d{3}\w+\.sql)$/', $filename) {
                        if( 0 == preg_match('/^(\d{3}_TEST\w*\.sql)$/', $filename)) {
                            $files[$filename] = $fileinfo->getPathname();
                        } 
                    }
                }      
            }
            
            ksort($files);
            foreach($files as $filepath) {
                $content = file_get_contents($filepath);
                fwrite($outfileHandle, $content);
            } 
        }
    }
    ]]>
</adhoc-task>

Die eigenen Tasks sollten immer von der Klasse Task erben, um kompatibel mit den PHING Tasks zu sein.
Wichtig beim Schreiben eigener Tasks ist es, dass für jede Klassenvariable ein Setter existiert und dass Zugriffsmodifizierer vor Methoden weg gelassen werden.

Der Task kann dann mit:

<sql dir="./svn_export/data/sql" outputfile="./db_setup.sql" />

aufgerufen werden, wobei im Hintergrund automatisch die Mainmethode angesprochen wird.

Da PHING Ausgaben die nicht auf dem STDOUT erfolgen verschluckt, ist es für Testzwecke sinnvoll das Script mit dem Parameter -debug aufzurufen.

Die zweite, wesentlich komplexere, Möglichkeit um eigene Tasks zu schreiben besteht in komplett eigenständigen Klassen.
Eine solche Klasse ist ähnlich aufgebaut wie der obige Inlinecode, muss aber noch eine init()-Methode besitzen, welche aufgerufen wird, wenn der Task abgeschlossen ist. Also nach dem schließenden XML-Tag des entsprechenden Tasks.
Zudem ist es möglich, Zugriffsmodifizierer für Methoden zu verwenden.
Ganz wichtig ist es, per require_once den abstrakten Task von PHING zu importieren.
Obige Klasse wäre also als eigenständige Klasse folgender Code:

<?php
require_once "phing/Task.php";

class Sql extends Task 
{
    private $dir;
		
    private $outputfile;
		
    public function setDir($dir)
    {
        $this->dir = $dir;
    }
        
    public function setOutputfile($file)
    {
        $this->outputfile = $file;
    }
		
	public function init()
	{
	   print('creating ' . $this->outputfile . ' was successfull!');
	}	
				
    public function main() 
    {
        $files = array();
            
        $outfileHandle = fopen($this->file, 'a');
        $iterator = new DirectoryIterator($this->dir);
        foreach($iterator as $fileinfo) {
            if ($fileinfo->isFile()) {
                $filename= $fileinfo->getFilename();
                if(0 != preg_match('/^(\d{3}\w+\.sql)$/', $filename) {
                    if( 0 == preg_match('/^(\d{3}_TEST\w*\.sql)$/', $filename)) {
                            $files[$filename] = $fileinfo->getPathname();
                    } 
                }
            }      
        }
            
        ksort($files);
        foreach($files as $filepath) {
            $content = file_get_contents($filepath);
            fwrite($outfileHandle, $content);
        } 
    }
}


Um die obige Klasse zu verwenden, müssen wir sie noch im Buildscript bekannt machen.
Das geschieht über den taskdefinition Task, welcher einen eindeutigen Namen und den Klassennamen als Attribut bekommt.
Zusätzlich kann noch der Klassenpfad definiert werden, der angibt in welcher Datei sich die Klasse befindet.
Obige Klasse könnten wir wie folgt einbinden:

<taskdef name="sqlmerge" classname="sql" classpath="/path/to/dir/filename.php"/>

Danach steht der Task im gesamten Buildfile zur Verfügung, wobei der Aufruf der selbe ist wie im Inlinecode Beispiel.

Das komplette Buildfile sollte hernach in etwa wie folgt aussehen, wenn die externe Klasse verwendet wird:

<?xml version="1.0" encoding="UTF-8"?>
<project name="FooBar" default="export" basedir=".">
    <target name="define" descprition="Defines all needed properties">
        <taskdef name="sqlmerge" classname="sql" classpath="/path/to/dir/filename.php"/>
        <property file="path/to/file/build.ini" />
        <property name="svn.user" value="anonymous" override="true"/>
        <propertyprompt propertyname="svn.password" defaultvaule="" 
         prompttext="Enter SVN password: "/> 
    </target>
    <target name="export" description="Get all files from svn repository" depends="define">
        <svnexport
            svnpath="/usr/bin/svn"
            username="${svn.user}"
            password="${svn.password}"
            force="true"
            nocache="true"
            repositoryurl="${svn.url}"
            todir="./svn_export"
            ignoreexternals="false"
        />
    </target>
    <target name="sql-merge" description="Merge all sql files into one" depends="export">
        <sqlmerge dir="./svn_export/data/sql" outputfile="./db_setup.sql" />
    </target>
</project>

Der nächste und letzte Teil werden wir uns anschauen wie Ordnerstrukturen abgebildet werden können und wie mithilfe dieses Buildscripts ein Deploymentpaket geschnürt werden kann.

Weitere Artikel wie Buildscripts mit PHING – Teil 2 finden Sie unter Mayflower Blog.


Viewing all articles
Browse latest Browse all 3

Trending Articles


Vimeo 10.7.1 by Vimeo.com, Inc.


UPDATE SC IDOL: TWO BECOME ONE


KASAMBAHAY BILL IN THE HOUSE


Girasoles para colorear


Presence Quotes – Positive Quotes


EASY COME, EASY GO


Love with Heart Breaking Quotes


Re:Mutton Pies (lleechef)


Ka longiing longsem kaba skhem bad kaba khlain ka pynlong kein ia ka...


Vimeo 10.7.0 by Vimeo.com, Inc.


FORECLOSURE OF REAL ESTATE MORTGAGE


FORTUITOUS EVENT


Pokemon para colorear


Sapos para colorear


Smile Quotes


Letting Go Quotes


Love Song lyrics that marks your Heart


RE: Mutton Pies (frankie241)


Hato lada ym dei namar ka jingpyrshah jong U JJM Nichols Roy (Bah Joy) ngin...


Long Distance Relationship Tagalog Love Quotes