SlideShare a Scribd company logo
PM* : « code faster »
                         PHP User Group – Bordeaux, France
                                     2011-04-13
                             Olivier HOAREAU, PHPPRO




* = « Project Manager » or « PHP Metaframework »
                                                             PM v0.1.0
What is PM ?
# PM seems to be a basic command line tool …
$ pm <command>

ok, but, it’s also …
•   … a generic command line “shortcuts / aliases” maker / runner
•   … a generic packager (.tgz / .zip / .phar / pear) for your app
•   … a generic custom code generator using your templates
•   … a set of predefined popular commands based on project type detection
•   … an external dependencies loader (.tgz / .phar / .zip)
•   … a “use it in your language” tool (at least, not only English ;) )
•   … an extensible tool based on PHP 5.3+
•   … the best friend of Hudson/Jenkins and others for PHP Projects ;)

•   … and a lot more (i.e. use it for your custom needs) !
OK, but I am already using <whatever>
                          framework, so why switch to PM ?

   • PM is not a conventional framework, you don’t need to switch :

          – Designed to work with all kind of projects :
                •   No framework projects
                •   Zend Framework projects
                •   Symfony projects
                •   CakePHP, and others !

          – Designed to « alias » your framework’s commands for you to keep your
            popular « commands » from one framework to an other (ex: from ZF to
            SF !) and to « map » your source tree layout

          – Designed to work out of the box (almost !) on any PHP project, even PHP
            projects not using PHP 5.3+ !*

* = you will need to have the PHP 5.3+ cli available on your system at least
Interested ? Start using PM !
# go to your existing project directory or create one
$ cd my-existing-project

# download pm.phar file at (or github.com/phppro/pm and’ download’)

https://github.com/downloads/phppro/pm/pm.phar
# enable pm support on your project
$ php pm.phar enable

# execute pm for the first time on your project !
$ pm

# begin customizing with your needs !
$ vi project.php
Not using PHP 5.3+ on your app ?
# install PHP 5.3+ as an extra version (recompile on linux)

# enable pm support on your project
$ <path/to/php/5.3>php pm.phar enable

# edit ‘pm’ or ‘pm.bat’ shell script to replace full path for php

# use pm !
$ pm
Linux users or others, install system-wide
                                         to avoid ./pm instead of pm

# put ‘pm’ (or pm.bat on windows) in some central directory
$ sudo mkdir /opt/pm
$ sudo cp pm /opt/pm/
$ sudo chmod +x /opt/pm/pm

# optional: put pm.phar in some central directory
$ sudo cp pm.phar /opt/pm/
# then replace pm.phar in ‘pm’ or ‘pm.bat’ by ‘/opt/pm/pm.phar’

# update your $PATH system variable to add /opt/pm directory

# use pm !
$ pm
List available commands
# list your bookmarked commands
$ pm

# list all available commands
$ pm -h

# get help on how to use command « tpl »
$ pm -h tpl

# list all available commands that are prefixed with « t »
$ pm -h t
Execute an existing command / alias
# Syntax: pm [common-options] <action> [action-options]

$ pm pkg

$ pm -d display_errors=On audit:cpd

$ pm tu MyClass

$ pm tpl mytemplate --my.variable=theValue

$ pm -o new
Use interactive mode (aka « pm shell »)

# open PM in interactive mode

$ pm -i

PM> -h
PM> tu
…

# quit PM in interactive mode
PM> quit
Add a custom command alias
# edit your configuration file
$ vi project.php

---
<?php

return array(
   ‘aliases.list’ => array(
         ‘co’ => ‘!svn commit’,
   ),
);

# use your new alias now !
$ pm co
Create a new custom command
# create an new command called ‘my:personal-action’ with some example of primitive you can use inside
$ pm new my:personal-action --example

#read the example provided in the generated class and customize your logic
$ vi _pm/actions/My/PersonalAction.php
---
<?php
…
class PersonalAction extends PMAction {
      public function run() {
              if (false === $this->confirm(‘Are your sure’) ) return;
              $feature = new MyClass($this->cfg (‘some.config.key’));
              $feature->doSomething($this->arg());
      }
}

# use your new command now !
$ pm my:personal-action
$ pm -o my:personal-action
Create a new inline (closure) command
# add directly your inline command to your project.php
$ vi project.php
---
<?php
return array(
    ‘aliases.list’ => array(
           ‘replace’ => function ($args) {
                      echo str_replace($args[0], $args[1], $args[2]);
           },
    ),
);

# use your new command now !
$ pm replace ab cd abcdef
Bookmark popular project commands
# add your popular project commands to the list

$ vi project.php
---
<?php

return array(
   ‘bookmarks.list’ => array(
          ‘unit tests’ => ‘pm tu’,
          ‘commit’ => ‘pm co’,
          ‘the very important command to keep in mind’ => ‘do-something’,
          …
   ),
);

# at anytime, list your bookmarked commands easily !
$ pm
Create a new code template
# create an new empty template called ‘my-tpl’ using example
$ pm tpl:new my-tpl --example
# … read generated example in _pm/templates/my-tpl
# … customize your template content
$ mkdir _pm/templates/my-tpl/sources
$ vi _pm/templates/my-tpl/sources/%{pm.ucfirst@class.name}.php
---
<?php
class %{pm.ucfirst@class.name} { … }

# use your new template now ! (--class.name=… is optional)
$ pm tpl my-tpl --class.name=MyClass
Executing unit tests
                               (using installed PHPUnit tool)
# customizing the location of your unit tests (PHPUnit)
$ vi project.php
---
<?php
return array(
    …
    ‘paths.list’ => array(
           ‘tests/unit/php’ => ‘test/library’,
           …
    ),
);

# execute unit tests in test/library/MyClassTest.php now !
$ pm tu
$ pm tu MyClass
Customizing an existing command
# replace existing command by yours
$ vi project.php
---
<?php
return array(
    ‘aliases.list’ => array(
          ‘tu’ => ‘atoum %{0|.}’,
          …
    ),
);

# execute your customized command now ! (« atoum MyClass »)
$ pm tu MyClass
Enabling logging/trace for a command

# execute your command with debug log enabled
$ pm -o tu

# execute your command with hard-core log enabled
$ pm -e tu

# execute your command by tracing all io.* as info
$ pm -t io=info tu

# execute your command by logging all notice (and above)
$ pm --verbose=notice tu
Use PM in your language (if exists ;))
# execute your command in french (if translated…)
$ pm -l=fr-fr tu

# force using french for all team member of the project
$ vi project.php
---
<?php
return array(
    …
    ‘lang’ => ‘fr-fr’,
    …
);

$ pm tu
Upgrade your database using scripts
# create repository for your differentials scripts
$ pm db:repo:create configs/mysql

# creates differentials scripts for your database
$ vi configs/mysql/2/01_all_schema_create_products_table.sql
---
-- dump the content of your differential script here

# set your database credentials and location in your configuration
$ vi project.php
---
<?php
return array(
     ‘databases.list’ => …
     …
                                   Soon available …
);

# upgrade your database using differential scripts
$ pm db:up
Audit your code
# first, index your source code
$ pm source:index
                                              Soon available …
# then, request the index …
# … to list biggest method (in lines) using predefined queries …
$ pm source:query methods.biggest

# … or using pure sql
$ pm source:query "SELECT name FROM methods ORDER BY DESC lines LIMIT 0,10"

# … to get the size per file extension
$ pm source:query "SELECT size FROM files GROUP BY extension"

# … same but exported in CSV
$ pm source:query "SELECT size FROM files GROUP BY extension" --format=csv
Adds conditional features
# example: add ‘co’ alias to commit only if svn client available
$ vi project.php
---
…
     ‘conditional.sets.list’ => array(              assertTreeContains
           …                                        assertTreeNotContains
            'svn'     => 'assertTreeContains:.svn', assertSystemPathContainsOne
           …                                        assertContextFlagExists
     ),                                             assertContextContains
     ‘svn.sets.list’ => array(                      …
           ‘aliases.list’ => array(
                       ‘co’ => ‘!svn commit’,
           ),
     ),
…
# if your project is « subversionned » (i.e. you have a .svn directory), use :
$ pm co
Adds environment specific features
# example: add ‘cache:clean’ alias only on your integration server
$ vi project.php
---
…
     ‘environments.list’ => array(
            …
             ‘integ-01‘ => array(
                        ‘aliases.list’ => array(
                                     ‘cache:clean’ => ‘!rm –rf /tmp/myapp/cache’,
                        ),
            ),
            …
     ),
# on your integration server ‘integ-01’, you can now use your command:
$ pm --env=integ-01 cache:clean

# to autodetect the environment, use the ‘COMPUTERNAME’ environment variable
$ export COMPUTERNAME=integ-01
$ pm cache:clean
Adds user specific features
# example: replaces an existing ‘co’ alias by yours only for the user ‘ohoareau‘:
$ vi project.php
---
     ‘users.list’ => array(
               ‘ohoareau‘ => array(
                           ‘aliases.list’ => array(
                                          ‘co’ => ‘!my-specific-co-command’,
                           ),
                           ‘user.name’ => ‘Olivier Hoareau’,
                           ‘user.email’ => ‘something@example.com’,
                           ‘company.name’ => ‘PHPPRO’,
                           ‘company.website’ => ‘http://www.phppro.fr’,
                           ‘lang’ => ‘fr-fr’,
              ),
     ),
# you can now use your command:
$ pm --user=ohoareau co

# to autodetect the current user, use the ‘USERNAME’ environment variable
$ export USERNAME=ohoareau
$ pm co
Translates (pm) messages
                  in your language
# generates a stub for your translation file
$ pm :i18n:new de-de --from=fr-fr

# edit your locale file and translate messages
$ vi _pm/i18n/de-de.php

# send us your locale file _pm/i18n/de-de.php !
Some usage examples taken
    from the real life
As a developer, I want to maintain « textual »
               specification of my application and distribute
                                  it in PDF
# example: using latex (or markdown, or some other transformable text format) :
$ vi project.php
---
    ‘aliases.list’ => array(
            ‘spec:gen‘ => ‘!pdflatex %{/docs/latex}/%{0}.tex --output-
    directory=%{/docs/generated}’,
           ),
    ),

# then, edit your latex files…
# then « generate » pdf from your latex file
$ pm spec:gen feature-xyz

# then send it by mail !
$ pm email:file docs/generated/feature-xyz.pdf boss@mycompany.com
As a developer, I want to svn update, execute
            unit tests before committing in one single
                             command
# add your custom « sequence » command to your project
$ vi project.php
---
    ‘aliases.list’ => array(
          ‘c‘ => array(‘up’, ‘tu’, ‘co’),
    ),

# then use your alias to code faster !
$ pm c
As an open source project lead developer, I
            want to package my development into a PEAR-
             compatible package in one single command
# specify the list of directories to include
$ vi project.php
---
    ‘includepaths.list’ => array(
                                                           Beta
           ‘library’,
    ),
# then package !
$ pm pkg --format=pear --version=1.12.3-RC3

# then install / distribute your PEAR compatible package
$ pear install builds/zend-framework-1.12.3-RC3.tgz
Other real life examples …
• Generate empty controller / model using default comments
  and current user info
• Generate model classes using an existing database (tables)
  using custom tree template
• Update local database directly after a svn update (post-
  update script)
• List all available useful commands on the project for new
  incoming developers
• Use same commands on local desktop and on integration
  server (maintenance purpose)
• …
Roadmap
Todo
•   Full support for popular frameworks (ZF, Symfony, CakePHP…)
•   Standalone pm.exe containing PHP 5.3 (+dlls) !
•   Hard core unit test coverage (code is designed for that)
•   Debian package + repository for PM
•   PEAR package for PM (80% done)
•   Plugin support + Plugin development kit
•   Ability to share your alias / command with others
•   Windows installer optionally installing PHP 5.3
•   PM documentation online
•   PM web hub
•   XML / Ini configuration file format (project.xml / project.ini)
•   Ability to manage project using other technology than PHP
•   Non regression tests on PM core features
•   Provide Jenkins (Hudson) plugin for PM
More ideas ?
Want to enhance / contribute ?
Fork / Contribute PM project
# clone PM repository
$ git clone git@github.com:phppro/pm.git pm
# clone P (underlying framework) repository
$ git clone git@github.com:phppro/p.git p

# modify locally PM source code to contribute / enhance !
$ cd pm
…

# package your local version
$ php bins/pm.php pkg
# or package + locally deploy (Package + Deploy)
$ php bins/pm.php pd

# if you want to contribute, fork pm project on github.com then request
# for pull
Thanks !

Happy PM-ing !

pm@phppro.fr

More Related Content

PDF
Final opensource record 2019
PDF
Php through the eyes of a hoster phpbnl11
ODP
PHP: The Beginning and the Zend
PPT
Migration from ASP to ASP.NET
PPTX
DNN Upgrades Made Simple (DNN Summit 2019)
PPT
Why and How Powershell will rule the Command Line - Barcamp LA 4
PPTX
Powershell Demo Presentation
PPT
Powershell Seminar @ ITWorx CuttingEdge Club
Final opensource record 2019
Php through the eyes of a hoster phpbnl11
PHP: The Beginning and the Zend
Migration from ASP to ASP.NET
DNN Upgrades Made Simple (DNN Summit 2019)
Why and How Powershell will rule the Command Line - Barcamp LA 4
Powershell Demo Presentation
Powershell Seminar @ ITWorx CuttingEdge Club

What's hot (20)

PPSX
Sunil phani's take on windows powershell
PDF
Introduction to PowerShell
PPTX
Powershell alias
PPTX
Professional Help for PowerShell Modules
PPTX
PowerShell-1
PPTX
Linux networking
PDF
PuppetConf 2016: Puppet 4.x: The Low WAT-tage Edition – Nick Fagerlund, Puppet
PPTX
PowerShell 101
PPTX
Pwning with powershell
PDF
Basic commands for powershell : Configuring Windows PowerShell and working wi...
PDF
Painless Perl Ports with cpan2port
PPT
Realtime Communication Techniques with PHP
PDF
Vagrant + Rouster at salesforce.com - PuppetConf 2013
PPTX
Introduction to Powershell Version 5
PPTX
Introduction To Windows Power Shell
PPTX
Introduction To Power Shell
PPT
Sandy Report
PDF
Red hat lvm cheatsheet
PPT
Shell programming
PDF
Basic linux commands
Sunil phani's take on windows powershell
Introduction to PowerShell
Powershell alias
Professional Help for PowerShell Modules
PowerShell-1
Linux networking
PuppetConf 2016: Puppet 4.x: The Low WAT-tage Edition – Nick Fagerlund, Puppet
PowerShell 101
Pwning with powershell
Basic commands for powershell : Configuring Windows PowerShell and working wi...
Painless Perl Ports with cpan2port
Realtime Communication Techniques with PHP
Vagrant + Rouster at salesforce.com - PuppetConf 2013
Introduction to Powershell Version 5
Introduction To Windows Power Shell
Introduction To Power Shell
Sandy Report
Red hat lvm cheatsheet
Shell programming
Basic linux commands
Ad

Similar to PM : code faster (20)

PDF
From Dev to DevOps - Codemotion ES 2012
KEY
Puppet for Java developers - JavaZone NO 2012
PDF
Lean Php Presentation
PDF
May The Nodejs Be With You
PDF
Linux basic for CADD biologist
PDF
Writing and Publishing Puppet Modules - PuppetConf 2014
KEY
From Dev to DevOps - ApacheCON NA 2011
PDF
Does your configuration code smell?
PDF
Web development automatisation for fun and profit (Artem Daniliants)
PDF
Puppi. Puppet strings to the shell
KEY
From Dev to DevOps - FOSDEM 2012
PPTX
Learning Puppet basic thing
PDF
Introduction to WP-CLI: Manage WordPress from the command line
PPT
Python Deployment with Fabric
PDF
Custom deployments with sbt-native-packager
PDF
Puppet: Eclipsecon ALM 2013
PDF
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
DOCX
Perl 20tips
PDF
From Dev to DevOps
From Dev to DevOps - Codemotion ES 2012
Puppet for Java developers - JavaZone NO 2012
Lean Php Presentation
May The Nodejs Be With You
Linux basic for CADD biologist
Writing and Publishing Puppet Modules - PuppetConf 2014
From Dev to DevOps - ApacheCON NA 2011
Does your configuration code smell?
Web development automatisation for fun and profit (Artem Daniliants)
Puppi. Puppet strings to the shell
From Dev to DevOps - FOSDEM 2012
Learning Puppet basic thing
Introduction to WP-CLI: Manage WordPress from the command line
Python Deployment with Fabric
Custom deployments with sbt-native-packager
Puppet: Eclipsecon ALM 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Perl 20tips
From Dev to DevOps
Ad

More from PHPPRO (6)

PPTX
Intro sur les tests unitaires
PPTX
Marathon De L Industrialisation
PPTX
20100221 my phingtool - blog
PPTX
AFUP Forum PHP 2009 : Oui ! PHP est industriel !
PPTX
PHP : Une Plateforme Industrialisable Au Service De L'Agilité
PPTX
Agilité, Tests Et Industrialisation
Intro sur les tests unitaires
Marathon De L Industrialisation
20100221 my phingtool - blog
AFUP Forum PHP 2009 : Oui ! PHP est industriel !
PHP : Une Plateforme Industrialisable Au Service De L'Agilité
Agilité, Tests Et Industrialisation

Recently uploaded (20)

PPT
Teaching material agriculture food technology
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Spectroscopy.pptx food analysis technology
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Cloud computing and distributed systems.
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Empathic Computing: Creating Shared Understanding
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
KodekX | Application Modernization Development
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Approach and Philosophy of On baking technology
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
Teaching material agriculture food technology
NewMind AI Weekly Chronicles - August'25 Week I
Spectroscopy.pptx food analysis technology
Spectral efficient network and resource selection model in 5G networks
Cloud computing and distributed systems.
Digital-Transformation-Roadmap-for-Companies.pptx
Building Integrated photovoltaic BIPV_UPV.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Per capita expenditure prediction using model stacking based on satellite ima...
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Machine learning based COVID-19 study performance prediction
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Empathic Computing: Creating Shared Understanding
Mobile App Security Testing_ A Comprehensive Guide.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
KodekX | Application Modernization Development
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Approach and Philosophy of On baking technology
“AI and Expert System Decision Support & Business Intelligence Systems”

PM : code faster

  • 1. PM* : « code faster » PHP User Group – Bordeaux, France 2011-04-13 Olivier HOAREAU, PHPPRO * = « Project Manager » or « PHP Metaframework » PM v0.1.0
  • 2. What is PM ? # PM seems to be a basic command line tool … $ pm <command> ok, but, it’s also … • … a generic command line “shortcuts / aliases” maker / runner • … a generic packager (.tgz / .zip / .phar / pear) for your app • … a generic custom code generator using your templates • … a set of predefined popular commands based on project type detection • … an external dependencies loader (.tgz / .phar / .zip) • … a “use it in your language” tool (at least, not only English ;) ) • … an extensible tool based on PHP 5.3+ • … the best friend of Hudson/Jenkins and others for PHP Projects ;) • … and a lot more (i.e. use it for your custom needs) !
  • 3. OK, but I am already using <whatever> framework, so why switch to PM ? • PM is not a conventional framework, you don’t need to switch : – Designed to work with all kind of projects : • No framework projects • Zend Framework projects • Symfony projects • CakePHP, and others ! – Designed to « alias » your framework’s commands for you to keep your popular « commands » from one framework to an other (ex: from ZF to SF !) and to « map » your source tree layout – Designed to work out of the box (almost !) on any PHP project, even PHP projects not using PHP 5.3+ !* * = you will need to have the PHP 5.3+ cli available on your system at least
  • 4. Interested ? Start using PM ! # go to your existing project directory or create one $ cd my-existing-project # download pm.phar file at (or github.com/phppro/pm and’ download’) https://github.com/downloads/phppro/pm/pm.phar # enable pm support on your project $ php pm.phar enable # execute pm for the first time on your project ! $ pm # begin customizing with your needs ! $ vi project.php
  • 5. Not using PHP 5.3+ on your app ? # install PHP 5.3+ as an extra version (recompile on linux) # enable pm support on your project $ <path/to/php/5.3>php pm.phar enable # edit ‘pm’ or ‘pm.bat’ shell script to replace full path for php # use pm ! $ pm
  • 6. Linux users or others, install system-wide  to avoid ./pm instead of pm # put ‘pm’ (or pm.bat on windows) in some central directory $ sudo mkdir /opt/pm $ sudo cp pm /opt/pm/ $ sudo chmod +x /opt/pm/pm # optional: put pm.phar in some central directory $ sudo cp pm.phar /opt/pm/ # then replace pm.phar in ‘pm’ or ‘pm.bat’ by ‘/opt/pm/pm.phar’ # update your $PATH system variable to add /opt/pm directory # use pm ! $ pm
  • 7. List available commands # list your bookmarked commands $ pm # list all available commands $ pm -h # get help on how to use command « tpl » $ pm -h tpl # list all available commands that are prefixed with « t » $ pm -h t
  • 8. Execute an existing command / alias # Syntax: pm [common-options] <action> [action-options] $ pm pkg $ pm -d display_errors=On audit:cpd $ pm tu MyClass $ pm tpl mytemplate --my.variable=theValue $ pm -o new
  • 9. Use interactive mode (aka « pm shell ») # open PM in interactive mode $ pm -i PM> -h PM> tu … # quit PM in interactive mode PM> quit
  • 10. Add a custom command alias # edit your configuration file $ vi project.php --- <?php return array( ‘aliases.list’ => array( ‘co’ => ‘!svn commit’, ), ); # use your new alias now ! $ pm co
  • 11. Create a new custom command # create an new command called ‘my:personal-action’ with some example of primitive you can use inside $ pm new my:personal-action --example #read the example provided in the generated class and customize your logic $ vi _pm/actions/My/PersonalAction.php --- <?php … class PersonalAction extends PMAction { public function run() { if (false === $this->confirm(‘Are your sure’) ) return; $feature = new MyClass($this->cfg (‘some.config.key’)); $feature->doSomething($this->arg()); } } # use your new command now ! $ pm my:personal-action $ pm -o my:personal-action
  • 12. Create a new inline (closure) command # add directly your inline command to your project.php $ vi project.php --- <?php return array( ‘aliases.list’ => array( ‘replace’ => function ($args) { echo str_replace($args[0], $args[1], $args[2]); }, ), ); # use your new command now ! $ pm replace ab cd abcdef
  • 13. Bookmark popular project commands # add your popular project commands to the list $ vi project.php --- <?php return array( ‘bookmarks.list’ => array( ‘unit tests’ => ‘pm tu’, ‘commit’ => ‘pm co’, ‘the very important command to keep in mind’ => ‘do-something’, … ), ); # at anytime, list your bookmarked commands easily ! $ pm
  • 14. Create a new code template # create an new empty template called ‘my-tpl’ using example $ pm tpl:new my-tpl --example # … read generated example in _pm/templates/my-tpl # … customize your template content $ mkdir _pm/templates/my-tpl/sources $ vi _pm/templates/my-tpl/sources/%{pm.ucfirst@class.name}.php --- <?php class %{pm.ucfirst@class.name} { … } # use your new template now ! (--class.name=… is optional) $ pm tpl my-tpl --class.name=MyClass
  • 15. Executing unit tests (using installed PHPUnit tool) # customizing the location of your unit tests (PHPUnit) $ vi project.php --- <?php return array( … ‘paths.list’ => array( ‘tests/unit/php’ => ‘test/library’, … ), ); # execute unit tests in test/library/MyClassTest.php now ! $ pm tu $ pm tu MyClass
  • 16. Customizing an existing command # replace existing command by yours $ vi project.php --- <?php return array( ‘aliases.list’ => array( ‘tu’ => ‘atoum %{0|.}’, … ), ); # execute your customized command now ! (« atoum MyClass ») $ pm tu MyClass
  • 17. Enabling logging/trace for a command # execute your command with debug log enabled $ pm -o tu # execute your command with hard-core log enabled $ pm -e tu # execute your command by tracing all io.* as info $ pm -t io=info tu # execute your command by logging all notice (and above) $ pm --verbose=notice tu
  • 18. Use PM in your language (if exists ;)) # execute your command in french (if translated…) $ pm -l=fr-fr tu # force using french for all team member of the project $ vi project.php --- <?php return array( … ‘lang’ => ‘fr-fr’, … ); $ pm tu
  • 19. Upgrade your database using scripts # create repository for your differentials scripts $ pm db:repo:create configs/mysql # creates differentials scripts for your database $ vi configs/mysql/2/01_all_schema_create_products_table.sql --- -- dump the content of your differential script here # set your database credentials and location in your configuration $ vi project.php --- <?php return array( ‘databases.list’ => … … Soon available … ); # upgrade your database using differential scripts $ pm db:up
  • 20. Audit your code # first, index your source code $ pm source:index Soon available … # then, request the index … # … to list biggest method (in lines) using predefined queries … $ pm source:query methods.biggest # … or using pure sql $ pm source:query "SELECT name FROM methods ORDER BY DESC lines LIMIT 0,10" # … to get the size per file extension $ pm source:query "SELECT size FROM files GROUP BY extension" # … same but exported in CSV $ pm source:query "SELECT size FROM files GROUP BY extension" --format=csv
  • 21. Adds conditional features # example: add ‘co’ alias to commit only if svn client available $ vi project.php --- … ‘conditional.sets.list’ => array( assertTreeContains … assertTreeNotContains 'svn' => 'assertTreeContains:.svn', assertSystemPathContainsOne … assertContextFlagExists ), assertContextContains ‘svn.sets.list’ => array( … ‘aliases.list’ => array( ‘co’ => ‘!svn commit’, ), ), … # if your project is « subversionned » (i.e. you have a .svn directory), use : $ pm co
  • 22. Adds environment specific features # example: add ‘cache:clean’ alias only on your integration server $ vi project.php --- … ‘environments.list’ => array( … ‘integ-01‘ => array( ‘aliases.list’ => array( ‘cache:clean’ => ‘!rm –rf /tmp/myapp/cache’, ), ), … ), # on your integration server ‘integ-01’, you can now use your command: $ pm --env=integ-01 cache:clean # to autodetect the environment, use the ‘COMPUTERNAME’ environment variable $ export COMPUTERNAME=integ-01 $ pm cache:clean
  • 23. Adds user specific features # example: replaces an existing ‘co’ alias by yours only for the user ‘ohoareau‘: $ vi project.php --- ‘users.list’ => array( ‘ohoareau‘ => array( ‘aliases.list’ => array( ‘co’ => ‘!my-specific-co-command’, ), ‘user.name’ => ‘Olivier Hoareau’, ‘user.email’ => ‘something@example.com’, ‘company.name’ => ‘PHPPRO’, ‘company.website’ => ‘http://www.phppro.fr’, ‘lang’ => ‘fr-fr’, ), ), # you can now use your command: $ pm --user=ohoareau co # to autodetect the current user, use the ‘USERNAME’ environment variable $ export USERNAME=ohoareau $ pm co
  • 24. Translates (pm) messages in your language # generates a stub for your translation file $ pm :i18n:new de-de --from=fr-fr # edit your locale file and translate messages $ vi _pm/i18n/de-de.php # send us your locale file _pm/i18n/de-de.php !
  • 25. Some usage examples taken from the real life
  • 26. As a developer, I want to maintain « textual » specification of my application and distribute it in PDF # example: using latex (or markdown, or some other transformable text format) : $ vi project.php --- ‘aliases.list’ => array( ‘spec:gen‘ => ‘!pdflatex %{/docs/latex}/%{0}.tex --output- directory=%{/docs/generated}’, ), ), # then, edit your latex files… # then « generate » pdf from your latex file $ pm spec:gen feature-xyz # then send it by mail ! $ pm email:file docs/generated/feature-xyz.pdf boss@mycompany.com
  • 27. As a developer, I want to svn update, execute unit tests before committing in one single command # add your custom « sequence » command to your project $ vi project.php --- ‘aliases.list’ => array( ‘c‘ => array(‘up’, ‘tu’, ‘co’), ), # then use your alias to code faster ! $ pm c
  • 28. As an open source project lead developer, I want to package my development into a PEAR- compatible package in one single command # specify the list of directories to include $ vi project.php --- ‘includepaths.list’ => array( Beta ‘library’, ), # then package ! $ pm pkg --format=pear --version=1.12.3-RC3 # then install / distribute your PEAR compatible package $ pear install builds/zend-framework-1.12.3-RC3.tgz
  • 29. Other real life examples … • Generate empty controller / model using default comments and current user info • Generate model classes using an existing database (tables) using custom tree template • Update local database directly after a svn update (post- update script) • List all available useful commands on the project for new incoming developers • Use same commands on local desktop and on integration server (maintenance purpose) • …
  • 31. Todo • Full support for popular frameworks (ZF, Symfony, CakePHP…) • Standalone pm.exe containing PHP 5.3 (+dlls) ! • Hard core unit test coverage (code is designed for that) • Debian package + repository for PM • PEAR package for PM (80% done) • Plugin support + Plugin development kit • Ability to share your alias / command with others • Windows installer optionally installing PHP 5.3 • PM documentation online • PM web hub • XML / Ini configuration file format (project.xml / project.ini) • Ability to manage project using other technology than PHP • Non regression tests on PM core features • Provide Jenkins (Hudson) plugin for PM
  • 33. Want to enhance / contribute ?
  • 34. Fork / Contribute PM project # clone PM repository $ git clone git@github.com:phppro/pm.git pm # clone P (underlying framework) repository $ git clone git@github.com:phppro/p.git p # modify locally PM source code to contribute / enhance ! $ cd pm … # package your local version $ php bins/pm.php pkg # or package + locally deploy (Package + Deploy) $ php bins/pm.php pd # if you want to contribute, fork pm project on github.com then request # for pull
  • 35. Thanks ! Happy PM-ing ! pm@phppro.fr