The Future of Software Development - Devin AI Innovative Approach.pdf
Automation using-phing
1. Automation Using
Phing
rajat_pandit@ipcmedia.com
Sunday, 20 June 2010
2. What is phing
• Phing Is Not Gnumake
• Its a project build tool
• Based on Apache Ant
• Cross Platform (Runs everywhere php
works)
• Lots of projects using it (Propel, Xinc,
symfony, prada)
Sunday, 20 June 2010
3. No compiling involved,
so what does it build?
• Automation of non-development tasks
• Configuring
• Packaging
• Uploading to remote servers
• Testing
Sunday, 20 June 2010
4. More automation...
• Run unit tests for you and publish
reports
• Build API Docs
• Package and / or install PEAR
packages
• Environment Setup
• App Configuration
Sunday, 20 June 2010
5. More automation...
• setting up permissions
• environment setup
• app config
• basically anywhere you can script,
you can use phing
Sunday, 20 June 2010
6. Other Alternatives
available
• Quite a few options available:
• ANT, Rake, NAnt
• Why Phing then?
• Dev already familiar with the language
• You can embed php straight in your build
script
• Custom extensions are easy to write
• Works across platforms, small footprint
Sunday, 20 June 2010
7. Phing: Basics
• Task: Built in custom piece of code to
perform a specific function
• Target: Grouping of tasks to perform
a more general function
• Project: Root node of build files
containing one or more targets
Sunday, 20 June 2010
9. Phing: Selecting a bunch
of files
• <fileset> is used to represent a
bunch of files to do stuff with
• Many tasks support <fileset>
<fileset dir="/foo"
includes="**/*.html"
excludes="**/test-*" />
<fileset dir="/bla">
<includes name="img/${theme}/*.jpg" />
<includes name="js/*.js" />
• </fileset>
Sunday, 20 June 2010
10. Phing: Fine tuning the
selection
• You might need to fine tune your file
selection further:
• Filter on date range?
• Filter on file size
• Type (File or Directory)
• At a particular depth
Sunday, 20 June 2010
12. Phing: Filesystem
Transformation
• <mapper> element adds filesystem
transformation capabilities for tasks
that support it e.g. <copy>, <move> etc
<copy todir="/tmp">
<mapper type="glob" from="*.php" to="*.php.bak" />
<fileset dir="./app" includes="**/*.php" />
• </copy>
Sunday, 20 June 2010
13. Phing: Filesystem
Transformation
• Other kind of mappers present:
• Flatten Mapper: Gets base filename
• Regex Mapper: Changes filenames
based on regular expressions
• Merge Mapper: change all source
filenames to the same name
Sunday, 20 June 2010
14. Phing: Data
Transformation
• <filterchain> is used to transform the
contents of the file. Supported by many tasks
like <copy>, <move> etc
• Can perform various actions:
• Strip comments from your files
• Replace values in your file
• Perform XSLT Transformations
• Above all your chain these transformations
Sunday, 20 June 2010
16. Phing: Data
Transformation
• <headfilter> Reads only the first n lines of the file
• <linecontains> Filters out lines that contain a
specific word
• <linecontainsregexp> Filters out lines that
contain a specific regular expression
• <prefixlines> Adds stuff to the lines of the
selected files
• <tabtospaces> Converts tabs to spaces
(HURRAH!!)
Sunday, 20 June 2010
17. Phing: More Data
Transformations
• <StripPHPComments> Takes out php
comments
• <replaceregexp>
• <replacetokens> This can particularly
be handy for spec files
Sunday, 20 June 2010
18. Phing: Data
Transformations
• Consider a file that contains:
The current user is ##current_user##
• Use this build target to replace the
token
<property environment="env" />
<filterchain>
<replacetokens begintoken="##" endtoken="##">
<token key="CURRENT" value="${env.LOGNAME}" />
<replacetoken>
</filterchain>
Sunday, 20 June 2010
19. Phing: Packaging
• Tasks like <tar> <zip> can compress
and package the set of files you want
to compress
• <pearpkg> and <pearpkg2> allows you
to build pear package using phing
Sunday, 20 June 2010
20. Phing: Version Control
and Deployment
• <svn*> tasks provide support for subversion:
• <svncheckout>
• <svncommit>
• <svnexport>
• <svnlastrevision>
• <scp> to move files to another server
• Support for CSV also present
Sunday, 20 June 2010
21. Phing: Support for DB
Migration
• <pdosqlexec> and <creole> provides
execution of database statements
• <dbdeploy> can take care of db
migrations
http://dbdeploy.com/documentation/getting-started/rules-for-
using-dbdeploy/
• Drupal Deployment solution anyone?
Sunday, 20 June 2010
22. Phing: Validating Code
• <jslint> using an external utility jsl
• <xmllint> uses internal DOM support
for validating against given schema
file
• <phplint> just uses php -l
• <tidy> can be use to validate markup
and cleanup html
Sunday, 20 June 2010
23. Phing: Php API Docs
• Support for phpDocumentor
<phpdoc title="API Documentation"
destdir="apidocs" sourcecode="no"
output="HTML:Smarty:PHP">
<fileset dir="./classes">
<include name="**/*.php" />
</fileset>
</phpdoc>
Sunday, 20 June 2010
24. Phing: Extending
Functionalities
• Two ways to extend Phing:
• Embed PHP in the build file itself (not the cleanest
solution)
• Write your own class to provide any of the following
functioanlity:
• Task
• Type
• Selector
• Filter
• and more...
Sunday, 20 June 2010
25. Phing: Extending
Functionality
• <phpevaltask> lets you set a property
to the results of evaluating a PHP
Expression or the results by a
function call.
<php function="crypt" returnProperty="enc_passwd">
<param value="${auth.root_passwd}"/>
</php>
<php expression="3 + 4" returnProperty="sum"/>
<php expression="echo 'test';">
Sunday, 20 June 2010
26. Phing: Extending
Functionality
• <adhoc-task> allows you to define a
task within your build file.
Sunday, 20 June 2010
28. Phing: Scripting & Logic
• Phing also supports conditional tags
<if>
<equals arg1="${foo}" arg2="bar" />
<then>
<echo message="The value of property foo is
'bar'" />
</then>
</elseif>
<else>
<echo message="The value of property foo is not
'foo' or 'bar'" />
</else>
</if>
Sunday, 20 June 2010
29. Phing: Writing a custom
task
require_once "phing/Task.php";
class MyEchoTask extends Task {
/**
* The message passed in the buildfile.
*/
private $message = null;
/**
* The setter for the attribute "message"
*/
public function setMessage($str) {
$this->message = $str;
}
/**
* The init method: Do init steps.
*/
public function init() {
// nothing to do here
}
/**
* The main entry point method.
*/
public function main() {
print($this->message);
Sunday, 20 June 2010 }
30. Phing: Using the
<myecho> task
<?xml version="1.0" ?>
<project name="test" basedir="." default="myecho">
<taskdef name="myecho"
classname="phing.tasks.my.MyEcho" />
<target name="test.myecho">
<myecho message="Hello World" />
</target>
</project>
Sunday, 20 June 2010