Composing Project
  Dependencies
          Derek Gallo
          @derekgallo
    http://github.com/drock
Problem
•Projects use many libs or
 frameworks
•Most libs have several
 dependencies
•Different projects need
 different versions
An Example
          Project A                   Project B




          PHPUnit                     PHPUnit
            3.7                         3.6




Symfony   PHPUnit           Symfony   PHPUnit
 YAML      Mocks      ...    YAML      Mocks      ...
  2.2       1.3               1.02      1.1
Pear
Project A             Project B

                                  Single shared
                                  dependency

            PHPUnit               No autoloading
              3.7

                                  Not part of build

 Symfony    PHPUnit
  YAML       Mocks       ...
   2.2        1.3
Submodules
          Project A                       Project B




          Symfony     PHPUnit             Symfony     PHPUnit
PHPUnit                         PHPUnit
           YAML        Mocks               YAML        Mocks
  3.7                             3.6
            2.2         1.3                 1.02        1.1



           No autoloading

           No dependency management
Composer!
          Project A                   Project B




          PHPUnit                     PHPUnit
            3.7                         3.6




Symfony   PHPUnit           Symfony   PHPUnit
 YAML      Mocks      ...    YAML      Mocks      ...
  2.2       1.3               1.02      1.1
Composer!

 •Autoloading
 • Dependency Management
 • Per project dependencies
 • Part of build
Composer is a tool for
dependency management
in PHP. It allows you to
declare the dependent
libraries your project needs
and it will install them in
your project for you.
Installation
  •Locally
   • curl -sS https://getcomposer.org/
      installer | php

  •Globally
   • sudo mv composer.phar /usr/local/bin/
      composer

  • composer selfupdate <- Do regularly
Silex Sample


  •Create empty project
   folder
  •   Create composer.json
Silex Sample
Silex Sample
• >composer install
Silex Sample
  • include autoloader
  • write controller
Silex Sample
  • add monolog
Silex Sample
  • >composer update
Silex Sample
  • add logging code
Defining
Dependencies
        Vendor/Package



                           Version




                           Stability
                         Requirements
Installing
Dependencies
•   >composer install
• downloads
 dependencies to
 vendor folder
•generates
 autoloader
Using Dependencies
  •PSR-0 - Standards
   defining naming
   conventions for
   autoloading.
  •Use composer generated
   autoloader
Updating
Dependencies
 •>composer update
 • upgrades packages to
  latest version based on
  rules in composer.json
Install vs Update
 •composer.lock
  •tracks versions of
    dependencies used
  •commit it
 •install-looks for composer.lock
   then composer.json
 •update-looks straight at
   composer.json and updates
   composer.lock
Working in a Team
•Elect a dependency
 manager
 •  manages and commits
    composer files
•add vendor folder to git/svn
 ignore
Finding Packages

  •Packagist
   • >composer search ...
  • Github
   • look for composer.json
Older Packages
                         Define a package
                        repository in your
                          composer.json


                                             Specify locations of
                                                   sources




                                  Instruct autoloader




• Hopefully its PSR-0 compliant
Bleeding Edge
         Version Tag
                       Version Branch




                         Other Branch
Custom Forks
 • Fork on Github
 • Add your repo
 • Specify your branch
Bootstrapping
>composer create-project -s dev fabpot/silex-skeleton .
More?
 • http://getcomposer.org
 • http://packagist.org
 • https://github.com/php-fig/fig-
   standards/blob/master/accepted/



            Thanks
                  Derek Gallo
                  @derekgallo
            http://github.com/drock

Composing Project Dependencies

  • 1.
    Composing Project Dependencies Derek Gallo @derekgallo http://github.com/drock
  • 2.
    Problem •Projects use manylibs or frameworks •Most libs have several dependencies •Different projects need different versions
  • 3.
    An Example Project A Project B PHPUnit PHPUnit 3.7 3.6 Symfony PHPUnit Symfony PHPUnit YAML Mocks ... YAML Mocks ... 2.2 1.3 1.02 1.1
  • 4.
    Pear Project A Project B Single shared dependency PHPUnit No autoloading 3.7 Not part of build Symfony PHPUnit YAML Mocks ... 2.2 1.3
  • 5.
    Submodules Project A Project B Symfony PHPUnit Symfony PHPUnit PHPUnit PHPUnit YAML Mocks YAML Mocks 3.7 3.6 2.2 1.3 1.02 1.1 No autoloading No dependency management
  • 6.
    Composer! Project A Project B PHPUnit PHPUnit 3.7 3.6 Symfony PHPUnit Symfony PHPUnit YAML Mocks ... YAML Mocks ... 2.2 1.3 1.02 1.1
  • 7.
    Composer! •Autoloading •Dependency Management • Per project dependencies • Part of build
  • 8.
    Composer is atool for dependency management in PHP. It allows you to declare the dependent libraries your project needs and it will install them in your project for you.
  • 9.
    Installation •Locally • curl -sS https://getcomposer.org/ installer | php •Globally • sudo mv composer.phar /usr/local/bin/ composer • composer selfupdate <- Do regularly
  • 10.
    Silex Sample •Create empty project folder • Create composer.json
  • 11.
  • 12.
  • 13.
    Silex Sample • include autoloader • write controller
  • 14.
    Silex Sample • add monolog
  • 15.
    Silex Sample • >composer update
  • 16.
    Silex Sample • add logging code
  • 17.
    Defining Dependencies Vendor/Package Version Stability Requirements
  • 18.
    Installing Dependencies • >composer install • downloads dependencies to vendor folder •generates autoloader
  • 19.
    Using Dependencies •PSR-0 - Standards defining naming conventions for autoloading. •Use composer generated autoloader
  • 20.
    Updating Dependencies •>composer update • upgrades packages to latest version based on rules in composer.json
  • 21.
    Install vs Update •composer.lock •tracks versions of dependencies used •commit it •install-looks for composer.lock then composer.json •update-looks straight at composer.json and updates composer.lock
  • 22.
    Working in aTeam •Elect a dependency manager • manages and commits composer files •add vendor folder to git/svn ignore
  • 23.
    Finding Packages •Packagist • >composer search ... • Github • look for composer.json
  • 24.
    Older Packages Define a package repository in your composer.json Specify locations of sources Instruct autoloader • Hopefully its PSR-0 compliant
  • 25.
    Bleeding Edge Version Tag Version Branch Other Branch
  • 26.
    Custom Forks •Fork on Github • Add your repo • Specify your branch
  • 27.
    Bootstrapping >composer create-project -sdev fabpot/silex-skeleton .
  • 28.
    More? • http://getcomposer.org • http://packagist.org • https://github.com/php-fig/fig- standards/blob/master/accepted/ Thanks Derek Gallo @derekgallo http://github.com/drock