Buildscripts mit PHING – Teil 2

Avatar von Alberto Assmann

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:


    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);
            } 
        }
    }
    ]]>

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:

    

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:

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:


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:



    
        
        
        
         
    
    
        
    
    
        
    

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.

Avatar von Alberto Assmann

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.