Ryan B, Blogger at CheshireCool slide! I am just getting into PHP at this moment - hopefully It’ll all come easy for me.:D http://www.payday-loan-companies.net3 years ago
Are you sure you want to
Your message goes here
guesta6da8c5cyeah, i also spent some time looking for the jslint task:) is this jsl good enough? i mean version 0.3, last refresh 2004 or 2006?! is there a way to use the crockford jslint? (without using rhino of course)4 years ago
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 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
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
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
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.
• This could include
– Configuring
– Packaging
– Uploading
– Testing
– Etc.
Hans Lellelid: Phing: Building in PHP 6
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
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
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
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
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 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
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
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
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 processing
• Many built-in tasks support <fileset>
Hans Lellelid: Phing: Building in PHP 16
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
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
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
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
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
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
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
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
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 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
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
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
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
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
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
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
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 seen:
– Task
– Type
– Selector
– Filter
– Mapper
– Listener (logger)
– ... and more.
Hans Lellelid: Phing: Building in PHP 35
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
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
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
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
Let LinkedIn power your SlideShare experience
+
Let LinkedIn power your SlideShare experience
Customize SlideShare content based on your interests
We will import your LinkedIn profile and you will be visible on SlideShare.
Keep up to date when your LinkedIn contacts post on SlideShare
http://www.payday-loan-companies.net 3 years ago
is this jsl good enough? i mean version 0.3, last refresh 2004 or 2006?!
is there a way to use the crockford jslint? (without using rhino of course) 4 years ago
does not work. Use (with two 'll' instead). 4 years ago