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

What's hot

Sunil phani's take on windows powershell
Sunil phani's take on windows powershellSunil phani's take on windows powershell
Sunil phani's take on windows powershell
Sunil Phani
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
Boulos Dib
 
Professional Help for PowerShell Modules
Professional Help for PowerShell ModulesProfessional Help for PowerShell Modules
Professional Help for PowerShell Modules
June Blender
 
Linux networking
Linux networkingLinux networking
Linux networking
Arie Bregman
 
PuppetConf 2016: Puppet 4.x: The Low WAT-tage Edition – Nick Fagerlund, Puppet
PuppetConf 2016: Puppet 4.x: The Low WAT-tage Edition – Nick Fagerlund, PuppetPuppetConf 2016: Puppet 4.x: The Low WAT-tage Edition – Nick Fagerlund, Puppet
PuppetConf 2016: Puppet 4.x: The Low WAT-tage Edition – Nick Fagerlund, Puppet
Puppet
 
PowerShell 101
PowerShell 101PowerShell 101
PowerShell 101
Thomas Lee
 
Pwning with powershell
Pwning with powershellPwning with powershell
Pwning with powershell
jaredhaight
 
Basic commands for powershell : Configuring Windows PowerShell and working wi...
Basic commands for powershell : Configuring Windows PowerShell and working wi...Basic commands for powershell : Configuring Windows PowerShell and working wi...
Basic commands for powershell : Configuring Windows PowerShell and working wi...
Hitesh Mohapatra
 
Painless Perl Ports with cpan2port
Painless Perl Ports with cpan2portPainless Perl Ports with cpan2port
Painless Perl Ports with cpan2portBenny Siegert
 
Realtime Communication Techniques with PHP
Realtime Communication Techniques with PHPRealtime Communication Techniques with PHP
Realtime Communication Techniques with PHPWaterSpout
 
Vagrant + Rouster at salesforce.com - PuppetConf 2013
Vagrant + Rouster at salesforce.com - PuppetConf 2013Vagrant + Rouster at salesforce.com - PuppetConf 2013
Vagrant + Rouster at salesforce.com - PuppetConf 2013
Puppet
 
Introduction to Powershell Version 5
Introduction to Powershell Version 5Introduction to Powershell Version 5
Introduction to Powershell Version 5
Nishtha Kesarwani
 
Introduction To Windows Power Shell
Introduction To Windows Power ShellIntroduction To Windows Power Shell
Introduction To Windows Power Shell
Microsoft TechNet
 
Introduction To Power Shell
Introduction To Power ShellIntroduction To Power Shell
Introduction To Power Shell
Ivan Suhinin
 
Sandy Report
Sandy ReportSandy Report
Sandy Report
sandeepkumar907
 
Red hat lvm cheatsheet
Red hat   lvm cheatsheetRed hat   lvm cheatsheet
Red hat lvm cheatsheet
Prakash Ghosh
 
Shell programming
Shell programmingShell programming
Shell programming
Moayad Moawiah
 
Basic linux commands
Basic linux commands Basic linux commands
Basic linux commands
Raghav Arora
 

What's hot (20)

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

Similar to PM : code faster

From Dev to DevOps - Codemotion ES 2012
From Dev to DevOps - Codemotion ES 2012From Dev to DevOps - Codemotion ES 2012
From Dev to DevOps - Codemotion ES 2012
Carlos Sanchez
 
Puppet for Java developers - JavaZone NO 2012
Puppet for Java developers - JavaZone NO 2012Puppet for Java developers - JavaZone NO 2012
Puppet for Java developers - JavaZone NO 2012
Carlos Sanchez
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php Presentation
Alan Pinstein
 
May The Nodejs Be With You
May The Nodejs Be With YouMay The Nodejs Be With You
May The Nodejs Be With You
Dalibor Gogic
 
Linux basic for CADD biologist
Linux basic for CADD biologistLinux basic for CADD biologist
Linux basic for CADD biologist
Ajay Murali
 
Writing and Publishing Puppet Modules - PuppetConf 2014
Writing and Publishing Puppet Modules - PuppetConf 2014Writing and Publishing Puppet Modules - PuppetConf 2014
Writing and Publishing Puppet Modules - PuppetConf 2014
Puppet
 
From Dev to DevOps - ApacheCON NA 2011
From Dev to DevOps - ApacheCON NA 2011From Dev to DevOps - ApacheCON NA 2011
From Dev to DevOps - ApacheCON NA 2011
Carlos Sanchez
 
Does your configuration code smell?
Does your configuration code smell?Does your configuration code smell?
Does your configuration code smell?
Tushar Sharma
 
Web development automatisation for fun and profit (Artem Daniliants)
Web development automatisation for fun and profit (Artem Daniliants)Web development automatisation for fun and profit (Artem Daniliants)
Web development automatisation for fun and profit (Artem Daniliants)
LumoSpark
 
Puppi. Puppet strings to the shell
Puppi. Puppet strings to the shellPuppi. Puppet strings to the shell
Puppi. Puppet strings to the shell
Alessandro Franceschi
 
From Dev to DevOps - FOSDEM 2012
From Dev to DevOps - FOSDEM 2012From Dev to DevOps - FOSDEM 2012
From Dev to DevOps - FOSDEM 2012
Carlos Sanchez
 
Learning Puppet basic thing
Learning Puppet basic thing Learning Puppet basic thing
Learning Puppet basic thing
DaeHyung Lee
 
Introduction to WP-CLI: Manage WordPress from the command line
Introduction to WP-CLI: Manage WordPress from the command lineIntroduction to WP-CLI: Manage WordPress from the command line
Introduction to WP-CLI: Manage WordPress from the command line
Behzod Saidov
 
Python Deployment with Fabric
Python Deployment with FabricPython Deployment with Fabric
Python Deployment with Fabricandymccurdy
 
Custom deployments with sbt-native-packager
Custom deployments with sbt-native-packagerCustom deployments with sbt-native-packager
Custom deployments with sbt-native-packager
GaryCoady
 
Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013
grim_radical
 
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Carlos Sanchez
 
Perl 20tips
Perl 20tipsPerl 20tips
Perl 20tips
Ravi Kumar
 
From Dev to DevOps
From Dev to DevOpsFrom Dev to DevOps
From Dev to DevOps
Agile Spain
 

Similar to PM : code faster (20)

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

More from PHPPRO

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

More from PHPPRO (6)

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

Recently uploaded

GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
Sri Ambati
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex ProofszkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
Alex Pruden
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
UiPathCommunity
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
Quantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIsQuantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIs
Vlad Stirbu
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
RESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for studentsRESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for students
KAMESHS29
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
Alpen-Adria-Universität
 
The Metaverse and AI: how can decision-makers harness the Metaverse for their...
The Metaverse and AI: how can decision-makers harness the Metaverse for their...The Metaverse and AI: how can decision-makers harness the Metaverse for their...
The Metaverse and AI: how can decision-makers harness the Metaverse for their...
Jen Stirrup
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Nexer Digital
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..
UiPathCommunity
 

Recently uploaded (20)

GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex ProofszkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
Quantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIsQuantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIs
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
RESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for studentsRESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for students
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
 
The Metaverse and AI: how can decision-makers harness the Metaverse for their...
The Metaverse and AI: how can decision-makers harness the Metaverse for their...The Metaverse and AI: how can decision-makers harness the Metaverse for their...
The Metaverse and AI: how can decision-makers harness the Metaverse for their...
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..
 

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