SlideShare ist ein Scribd-Unternehmen logo
1 von 35
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

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 powershellSunil Phani
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShellBoulos Dib
 
Professional Help for PowerShell Modules
Professional Help for PowerShell ModulesProfessional Help for PowerShell Modules
Professional Help for PowerShell ModulesJune Blender
 
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, PuppetPuppet
 
PowerShell 101
PowerShell 101PowerShell 101
PowerShell 101Thomas Lee
 
Pwning with powershell
Pwning with powershellPwning with powershell
Pwning with powershelljaredhaight
 
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 2013Puppet
 
Introduction to Powershell Version 5
Introduction to Powershell Version 5Introduction to Powershell Version 5
Introduction to Powershell Version 5Nishtha Kesarwani
 
Introduction To Windows Power Shell
Introduction To Windows Power ShellIntroduction To Windows Power Shell
Introduction To Windows Power ShellMicrosoft TechNet
 
Introduction To Power Shell
Introduction To Power ShellIntroduction To Power Shell
Introduction To Power ShellIvan Suhinin
 
Red hat lvm cheatsheet
Red hat   lvm cheatsheetRed hat   lvm cheatsheet
Red hat lvm cheatsheetPrakash Ghosh
 
Basic linux commands
Basic linux commands Basic linux commands
Basic linux commands Raghav Arora
 

Was ist angesagt? (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
 

Ähnlich wie 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 2012Carlos 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 2012Carlos Sanchez
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php PresentationAlan Pinstein
 
May The Nodejs Be With You
May The Nodejs Be With YouMay The Nodejs Be With You
May The Nodejs Be With YouDalibor Gogic
 
Linux basic for CADD biologist
Linux basic for CADD biologistLinux basic for CADD biologist
Linux basic for CADD biologistAjay 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 2014Puppet
 
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 2011Carlos 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
 
From Dev to DevOps - FOSDEM 2012
From Dev to DevOps - FOSDEM 2012From Dev to DevOps - FOSDEM 2012
From Dev to DevOps - FOSDEM 2012Carlos 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 lineBehzod 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-packagerGaryCoady
 
Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013grim_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 2013Carlos Sanchez
 
From Dev to DevOps
From Dev to DevOpsFrom Dev to DevOps
From Dev to DevOpsAgile Spain
 

Ähnlich wie 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
 

Mehr von 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 IndustrialisationPHPPRO
 
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 IndustrialisationPHPPRO
 

Mehr von 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
 

Kürzlich hochgeladen

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 

Kürzlich hochgeladen (20)

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 

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