Phing: Building in PHP
                   Hans Lellelid
   International PHP Conference
                     2007-11-06
Introduction
• My name is Hans Lellelid
• Developer & Manager at Applied Security,
  Inc. (near Washington DC).
• PHP deve...
This Talk
•   Brief Overview & “Justification”
•   Basic Usage
•   Packaginig & Deployment
•   Development Cycle
•   Exten...
What is it?
•   PHing Is Not Gnumake
•   It is a project build tool.
•   Original PHP4 version by Andreas Aderhold
•   Wri...
Why do I need a build tool
                  for PHP?



Hans Lellelid: Phing: Building in PHP   5
Building != Compiling
• In this context, “building” is really any non-
  development task that supports your
  application...
PHP apps > web pages
• PHP is no longer a simple web scripting
  language.
• We are using PHP to do all sorts of things
  ...
Web apps get deployed
• PHP web applications do eventually get
  deployed.
• Deployment has a whole lot of implications:
 ...
Phing can help.
• Anything you can do with a shell script you
  can do with Phing.
• And a whole lot more ...
      – Tran...
But why Phing specifically?
• Other choices do exist: Ant, Rake, NAnt
• With Phing you only need PHP.
• A PHP tool for PHP...
How do I start using it?




Hans Lellelid: Phing: Building in PHP     11
The Basics
• Phing provides a simple shell script
  (“phing”) that launches the Phing PHP app.
• You create build files in...
A simple build file
     <project name=quot;samplequot; default=quot;mainquot;>
        <property name=quot;verquot; value...
Javaisms
• Properties
      – Properties are variables for build scripts.
      – Like php.ini, but more flexible:
       ...
Packaging and Deployment




Hans Lellelid: Phing: Building in PHP   15
Match a bunch of files
• The <fileset> type represents an
  extremely powerful way to select a
  group of files for proces...
Fileset Examples
    <fileset dir=quot;./webappquot;
     includes=quot;**/*.htmlquot;
     excludes=quot;**/test-*quot;/>...
Fine-tuned Selection
• Selectors provide entirely new dimensions
  for <fileset> file matching criteria.
• Some examples o...
Selector examples
 <fileset dir=quot;${htdocs.dir}quot;>
    <includes name=”**/*.html”/>
    <containsregexp
      expres...
Filesystem Transformations
• The <mapper> element adds filesystem
  transformation capabilities to supporting
  tasks (e.g...
Mapper examples
 <copy todir=quot;/tmpquot;>
    <mapper type=quot;globquot; from=quot;*.phpquot;
      to=quot;*.php.bakq...
Data Transformation
• The <filterchain> type adds data
  filtering/transforming capabilities to
  supporting tasks.
• Task...
Filtering examples
    <copy todir=quot;${build}/htdocsquot;>
       <fileset includes=quot;*.htmlquot;/>
       <filterch...
Packaging Tools
• The <tar> and <zip> tasks allow you to
  bundle up your moved directories. (Of
  course, they support <f...
Deployment Tools
• Deployment means different things for
  different people.
• Phing includes some tasks to “put” stuff
  ...
Development Cycle




Hans Lellelid: Phing: Building in PHP    26
Building for Developers
• Not all build tasks are for deployment.
• Some build activities are specifically for
  developer...
Validating
• Phing includes several contributed lint tasks
  for checking the validity of source code:
      – <jslint> us...
PHP API Docs
• Phing includes support for
  PhpDocumentor using the <phpdoc>
  task.
 <phpdoc title=quot;API Documentation...
Unit Testing
• Phing has extensive support for PHPUnit
  and SimpleTest unit testing frameworks
• PHPUnit tasks provide su...
PHPUnit Example
    <phpunit2 haltonerror=quot;truequot;
         haltonfailure=quot;falsequot;
         printsummary=quot...
Continuous Integration
• Code -> Commit -> Build -> Test ->
  Report
• CI tools watch the repository and provide
  automat...
Xinc Config Example
 <projects>
     <project name=quot;Project Namequot; interval=quot;10quot;>
         <modificationset...
Extending Phing




Hans Lellelid: Phing: Building in PHP       34
Paths for Extension
• Embedding PHP in build file.
• Write your own class to provide any of the
  functionality we have se...
Embedding PHP
• The <php> task allows you to evaluate a
  PHP expression, function call, etc. and store
  result in a prop...
Sample Task
    class SampleTask extends Task {

          private $var;

          public function setVar($v) {
         ...
Phing IRL
• Phing is being used by many organizations
  and open-source projects.
• In the real world, Phing is used ...
 ...
Where next?
• Visit http://phing.info for downloads,
  documentation, and issue tracking.
• Ask questions on the mailing l...
Upcoming SlideShare
Loading in...5
×

Phing: Building with PHP

27,767

Published on

Phing presentation from 2007 International PHP Conference in Frankfurt.

Published in: Technology
4 Comments
47 Likes
Statistics
Notes
No Downloads
Views
Total Views
27,767
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
714
Comments
4
Likes
47
Embeds 0
No embeds

No notes for slide

Phing: Building with PHP

  1. 1. Phing: Building in PHP Hans Lellelid International PHP Conference 2007-11-06
  2. 2. Introduction • My name is Hans Lellelid • Developer & Manager at Applied Security, Inc. (near Washington DC). • PHP developer and OO evangelist. • I ported Phing to PHP5 in 2004. • I now manage the Phing project with Michiel Rook. Hans Lellelid: Phing: Building in PHP 2
  3. 3. This Talk • Brief Overview & “Justification” • Basic Usage • Packaginig & Deployment • Development Cycle • Extending Phing • Slides available at http://phing.info/presentations/ Hans Lellelid: Phing: Building in PHP 3
  4. 4. What is it? • PHing Is Not Gnumake • It is a project build tool. • Original PHP4 version by Andreas Aderhold • Written for PHP5 • Based on Apache Ant • Cross-platform (i.e. Windows too) • It seems to have caught on. – Propel, Prado, Symfony, Agavi, Xinc (to name a few) Hans Lellelid: Phing: Building in PHP 4
  5. 5. Why do I need a build tool for PHP? Hans Lellelid: Phing: Building in PHP 5
  6. 6. Building != Compiling • In this context, “building” is really any non- development task that supports your application. • This could include – Configuring – Packaging – Uploading – Testing – Etc. Hans Lellelid: Phing: Building in PHP 6
  7. 7. PHP apps > web pages • PHP is no longer a simple web scripting language. • We are using PHP to do all sorts of things on the CLI: – Run unit tests (PHPUnit, SimpleTest) – Build API docs (PhpDocumentor) – Install and Package (PEAR) Hans Lellelid: Phing: Building in PHP 7
  8. 8. Web apps get deployed • PHP web applications do eventually get deployed. • Deployment has a whole lot of implications: – Permissions – Environment setup – App Configuration Hans Lellelid: Phing: Building in PHP 8
  9. 9. Phing can help. • Anything you can do with a shell script you can do with Phing. • And a whole lot more ... – Transform directories and files. – Configure your application – Prepare files for deployment – Run unit tests – Do other useful stuff – like SVN commits or db initialization. Hans Lellelid: Phing: Building in PHP 9
  10. 10. But why Phing specifically? • Other choices do exist: Ant, Rake, NAnt • With Phing you only need PHP. • A PHP tool for PHP apps just makes a lot of sense: – Familiar territory, common environment – You can embed PHP directly in your build scripts. – You can integrate your own application code into Phing extensions. – Cross-pltform and small footprint. Hans Lellelid: Phing: Building in PHP 10
  11. 11. How do I start using it? Hans Lellelid: Phing: Building in PHP 11
  12. 12. The Basics • Phing provides a simple shell script (“phing”) that launches the Phing PHP app. • You create build files in XML • Build file organization: – Tasks: a “build-in” piece of code that performs a specific function. E.g. <mkdir> – Targets: grouping of Tasks that perform a more general function. E.g. Copy files to a new directory. – A Project: the root node for the build file. Hans Lellelid: Phing: Building in PHP 12
  13. 13. A simple build file <project name=quot;samplequot; default=quot;mainquot;> <property name=quot;verquot; value=quot;1.0.1quot;/> <property file=quot;build.propertiesquot;/> <target name=quot;mainquot;> <mkdir dir=quot;./build/${ver}quot;> <copy todir=quot;./build/${ver}quot;> <fileset dir=quot;.quot; includes=quot;*.txtquot; /> </copy> </target> </project> Hans Lellelid: Phing: Building in PHP 13
  14. 14. Javaisms • Properties – Properties are variables for build scripts. – Like php.ini, but more flexible: • tgz = ${pkg}-${ver}.tgz – Can be set in build script or imported from files. • Dot-path notation for class names: – path.to.Class = path/to/Class.php – Anwers question “How to represent both directory and class name in a single string?” Hans Lellelid: Phing: Building in PHP 14
  15. 15. Packaging and Deployment Hans Lellelid: Phing: Building in PHP 15
  16. 16. Match a bunch of files • The <fileset> type represents an extremely powerful way to select a group of files for processing • Many built-in tasks support <fileset> Hans Lellelid: Phing: Building in PHP 16
  17. 17. Fileset Examples <fileset dir=quot;./webappquot; includes=quot;**/*.htmlquot; excludes=quot;**/test-*quot;/> <fileset dir=quot;./webappquot;> <include name=quot;img/${theme}/*.jpgquot;/> <include name=quot;tpl/${lang}/*.phtmlquot;/> <exclude name=quot;**/*.bakquot;/> <exclude name=quot;**/test/**quot;/> </fileset> Hans Lellelid: Phing: Building in PHP 17
  18. 18. Fine-tuned Selection • Selectors provide entirely new dimensions for <fileset> file matching criteria. • Some examples of selectors: – Created before/after certain date – Greater/less than specified size – Type ('file' or 'dir') – At specific depth in dir structure – Having corresponding file in another dir. Hans Lellelid: Phing: Building in PHP 18
  19. 19. Selector examples <fileset dir=quot;${htdocs.dir}quot;> <includes name=”**/*.html”/> <containsregexp expression=quot;/prodd+.phpquot;/> </fileset> <fileset dir=quot;${dist}quot; includes=quot;**quot;> <or> <present targetdir=quot;${htdocs}quot;/> <date datetime=quot;01/01/2007quot; when=quot;beforequot;/> </or> </fileset> Hans Lellelid: Phing: Building in PHP 19
  20. 20. Filesystem Transformations • The <mapper> element adds filesystem transformation capabilities to supporting tasks (e.g. <copy>, <move>). • For example: – Change all “.php” files to “.html” – Remove dirs from filename – Change all files to the same filename • Custom mappers can be defined. Hans Lellelid: Phing: Building in PHP 20
  21. 21. Mapper examples <copy todir=quot;/tmpquot;> <mapper type=quot;globquot; from=quot;*.phpquot; to=quot;*.php.bakquot; /> <fileset dir=quot;./appquot; includes=quot;**/*.phpquot; /> </copy> <copy todir=quot;${deploy.dir}quot;> <mapper type=quot;regexpquot; from=quot;^(.*)-(.*).conf.xmlquot; to=quot;1.2.phpquot;/> <fileset dir=quot;${config.src.dir}quot; includes=quot;**/*.conf.xmlquot; /> </copy> Hans Lellelid: Phing: Building in PHP 21
  22. 22. Data Transformation • The <filterchain> type adds data filtering/transforming capabilities to supporting tasks. • Tasks that support <filterchain> include <copy>, <move>, <append> + more • For example: – Strip comments from files – Replace values in files (+ regexp) – Perform XSLT transformation • Easily add your own. Hans Lellelid: Phing: Building in PHP 22
  23. 23. Filtering examples <copy todir=quot;${build}/htdocsquot;> <fileset includes=quot;*.htmlquot;/> <filterchain> <replaceregexp> <regexp pattern=quot;rnquot; replace=quot;nquot;/> </replaceregexp> <tidyfilter encoding=quot;utf8quot;> <config name=quot;indentquot; value=quot;truequot;/> </tidyfilter> </filterchain> </copy> Hans Lellelid: Phing: Building in PHP 23
  24. 24. Packaging Tools • The <tar> and <zip> tasks allow you to bundle up your moved directories. (Of course, they support <fileset> too.) • <pearpkg> (and <pearpkg2>) tasks allow you to create PEAR packages using Phing. Hans Lellelid: Phing: Building in PHP 24
  25. 25. Deployment Tools • Deployment means different things for different people. • Phing includes some tasks to “put” stuff places: – <svn*> suite of tasks – <scp> • Database statement execution provided by <pdo> and <creole> tasks. Hans Lellelid: Phing: Building in PHP 25
  26. 26. Development Cycle Hans Lellelid: Phing: Building in PHP 26
  27. 27. Building for Developers • Not all build tasks are for deployment. • Some build activities are specifically for developer consumption: – Checking validity or cleaning documents – Building API documentation – Running unit tests • A more “traditional” build will likely also play a part in developer build functionality. Hans Lellelid: Phing: Building in PHP 27
  28. 28. Validating • Phing includes several contributed lint tasks for checking the validity of source code: – <jslint> uses external jsl utility. – <xmllint> uses built-in DOM support and validates with a schema file. – <phplint> users “php -l” • The <tidy> task also provides ability to perform validation and cleanup on HTML documents. Hans Lellelid: Phing: Building in PHP 28
  29. 29. PHP API Docs • Phing includes support for PhpDocumentor using the <phpdoc> task. <phpdoc title=quot;API Documentationquot; destdir=quot;apidocsquot; sourcecode=quot;noquot; output=quot;HTML:Smarty:PHPquot;> <fileset dir=quot;./classesquot;> <include name=quot;**/*.phpquot; /> </fileset> </phpdoc> Hans Lellelid: Phing: Building in PHP 29
  30. 30. Unit Testing • Phing has extensive support for PHPUnit and SimpleTest unit testing frameworks • PHPUnit tasks provide support for – Batch testing using <fileset> to select all the tests you wish to run. – Output in XML (Junit-compatible) and Plain text. – Report generator creates XHTML reports using XSLT – Code coverage reports (requires Xdebug) Hans Lellelid: Phing: Building in PHP 30
  31. 31. PHPUnit Example <phpunit2 haltonerror=quot;truequot; haltonfailure=quot;falsequot; printsummary=quot;truequot;> <batchtest> <fileset dir=quot;${tests.dir}quot;> <include name=quot;**/*Test.phpquot;/> </fileset> </batchtest> </phpunit2> Hans Lellelid: Phing: Building in PHP 31
  32. 32. Continuous Integration • Code -> Commit -> Build -> Test -> Report • CI tools watch the repository and provide automated building, testing, reporting. • CruiseControl has a Phing builder. • Xinc provides CI tool functionality written in PHP. • Xinc is built to use Phing Hans Lellelid: Phing: Building in PHP 32
  33. 33. Xinc Config Example <projects> <project name=quot;Project Namequot; interval=quot;10quot;> <modificationsets> <svn directory=quot;/var/projects/testquot;/> </modificationsets> <builder type=quot;phingquot; buildfile=quot;/var/projects/test/build.xmlquot; target=quot;buildquot;/> <publishers> <email to=quot;myemail@example.comquot; publishonfailure=quot;truequot;/> </publishers> </project> </projects> Hans Lellelid: Phing: Building in PHP 33
  34. 34. Extending Phing Hans Lellelid: Phing: Building in PHP 34
  35. 35. Paths for Extension • Embedding PHP in build file. • Write your own class to provide any of the functionality we have seen: – Task – Type – Selector – Filter – Mapper – Listener (logger) – ... and more. Hans Lellelid: Phing: Building in PHP 35
  36. 36. Embedding PHP • The <php> task allows you to evaluate a PHP expression, function call, etc. and store result in a property. • The <adhoc> task allows you to embed PHP directly. Useful for including setup files. <adhoc><![CDATA[ require_once 'propel/Propel.php'; Propel::init('bookstore-conf.php'); ]]></adhoc> Hans Lellelid: Phing: Building in PHP 36
  37. 37. Sample Task class SampleTask extends Task { private $var; public function setVar($v) { $this->var = $v; } public function main() { $this->log(quot;value: quot;.$this->var); } } Hans Lellelid: Phing: Building in PHP 37
  38. 38. Phing IRL • Phing is being used by many organizations and open-source projects. • In the real world, Phing is used ... – as an interactive CLI application configuration or installation script, – to upgrade production webservers, – to manage product release builds, – as a quick way to reorganize a directory tree, – & much, much more. Hans Lellelid: Phing: Building in PHP 38
  39. 39. Where next? • Visit http://phing.info for downloads, documentation, and issue tracking. • Ask questions on the mailing lists. – users@phing.tigris.org – dev@phing.tigris.org Hans Lellelid: Phing: Building in PHP 39
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×