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
Living With Legacy Code
PDF
Eclipse Pdt2.0 26.05.2009
PDF
Building and Deploying PHP Apps Using phing
PDF
Php Development With Eclipde PDT
PDF
The beautyandthebeast phpbat2010
PDF
Continuous Integration at Mollie
PDF
Create a PHP Library the right way
PPT
Synapse india reviews on php website development
PDF
Patterns and Tools for Database Versioning, Migration, Data Loading and Test ...
PDF
The Beauty And The Beast Php N W09
PDF
Introduction to PHP 5.3
PDF
Modern php
PPTX
FFW Gabrovo PMG - PHP OOP Part 3
ODP
PHP Quality Assurance Workshop PHPBenelux
PDF
Pecl Picks
PPT
Build Automation of PHP Applications
PDF
Advanced Eclipse Workshop (held at IPC2010 -spring edition-)
PDF
PECL Picks - Extensions to make your life better
PDF
Os Harkins
PDF
Living With Legacy Code
Eclipse Pdt2.0 26.05.2009
Building and Deploying PHP Apps Using phing
Php Development With Eclipde PDT
The beautyandthebeast phpbat2010
Continuous Integration at Mollie
Create a PHP Library the right way
Synapse india reviews on php website development
Patterns and Tools for Database Versioning, Migration, Data Loading and Test ...
The Beauty And The Beast Php N W09
Introduction to PHP 5.3
Modern php
FFW Gabrovo PMG - PHP OOP Part 3
PHP Quality Assurance Workshop PHPBenelux
Pecl Picks
Build Automation of PHP Applications
Advanced Eclipse Workshop (held at IPC2010 -spring edition-)
PECL Picks - Extensions to make your life better
Os Harkins
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)

PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PPT
Teaching material agriculture food technology
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
OMC Textile Division Presentation 2021.pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Approach and Philosophy of On baking technology
PPTX
1. Introduction to Computer Programming.pptx
PPTX
cloud_computing_Infrastucture_as_cloud_p
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Spectral efficient network and resource selection model in 5G networks
Building Integrated photovoltaic BIPV_UPV.pdf
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
SOPHOS-XG Firewall Administrator PPT.pptx
Teaching material agriculture food technology
Diabetes mellitus diagnosis method based random forest with bat algorithm
Encapsulation_ Review paper, used for researhc scholars
OMC Textile Division Presentation 2021.pptx
Machine learning based COVID-19 study performance prediction
Assigned Numbers - 2025 - Bluetooth® Document
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Group 1 Presentation -Planning and Decision Making .pptx
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
A comparative analysis of optical character recognition models for extracting...
Network Security Unit 5.pdf for BCA BBA.
Approach and Philosophy of On baking technology
1. Introduction to Computer Programming.pptx
cloud_computing_Infrastucture_as_cloud_p
Profit Center Accounting in SAP S/4HANA, S4F28 Col11

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/%{[email protected]}.php --- <?php class %{[email protected]} { … } # 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’ => ‘[email protected]’, ‘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 [email protected]
  • 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 [email protected]:phppro/pm.git pm # clone P (underlying framework) repository $ git clone [email protected]: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