SlideShare a Scribd company logo
Shifting gears with
Composer


                 Javier Lopez (@loalf)
Who am I?
Who am I?
• I am from Spain
Who am I?
• I am from Spain
• I live in London
Who am I?
• I am from Spain
• I live in London
• I work for IPC Media
Who am I?
• I am from Spain
• I live in London
• I work for IPC Media
• I tweet as @loalf
Who am I?
• I am from Spain
• I live in London
• I work for IPC Media
• I tweet as @loalf
• I co-organize DeSymfony (www.desymfony.com)
Who am I?
• I am from Spain
• I live in London
• I work for IPC Media
• I tweet as @loalf
• I co-organize DeSymfony (www.desymfony.com)

                             Still want to know more?
                      http://www.linkedin.com/in/loalf
Shifting gears




http://www.flickr.com/photos/jayshep5/5792259218/
My App
My App
My App
My App
My App
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.
Shifting gears with Composer
Is it a new concept?
Is it a new concept? Nope.
Is it a new concept? Nope.



Node Package Manager
Is it a new concept? Nope.



Node Package Manager




                  Ruby Package Manager
Shifting gears with Composer
But, what about PEAR?
But, what about PEAR?

• You have to install it in all the system
But, what about PEAR?

• You have to install it in all the system
• You can´t see the source code
But, what about PEAR?

• You have to install it in all the system
• You can´t see the source code
• Don´t allow different repository sources
But, what about PEAR?

• You have to install it in all the system
• You can´t see the source code
• Don´t allow different repository sources
• Composer is compatible with PEAR, :)
Shifting gears with Composer
Installing Composer (locally)
Installing Composer (locally)

mkdir myprojectname
Installing Composer (locally)

mkdir myprojectname
cd myprojectname
Installing Composer (locally)

mkdir myprojectname
cd myprojectname
curl -s https://getcomposer.org/installer | php
Installing Composer (locally)

mkdir myprojectname
cd myprojectname
curl -s https://getcomposer.org/installer | php



                                        Done!
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
// composer.json
{
  "require" : {
     "monolog/monolog" : "1.0.*",
     "symfony/translation" : "2.1.0-RC1",
     "behat/behat" : ">2.3.5,<2.4",
     "fabpot/goutte" : "dev-master"
  },
  "minimum-stability": "dev"
}
php composer.phar install
Installing dependencies
  - Installing guzzle/parser (v2.8.4)
    Downloading: 100%


  - Installing symfony/event-dispatcher (dev-master)
    Cloning v2.1.0-BETA4


  - Installing guzzle/common (v2.8.4)
    Downloading: 100%


  - Installing guzzle/http (v2.8.4)
    Downloading: 100%


  - Installing symfony/process (dev-master)
    Cloning v2.1.0-RC1


  - Installing symfony/finder (dev-master)
    Cloning 1af11ab3a686f9c45f2a8d9d721d5717cdd5f1d6
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
!"" composer.json
!"" composer.lock
#"" vendor
    !"" autoload.php
    !"" behat
    !"" bin
    !"" composer
    !"" fabpot
    !"" guzzle
    !"" monolog
    #"" symfony
http://www.packagist.org




             http://www.flickr.com/photos/jayshep5/5792259218/
http://www.flickr.com/photos/jayshep5/5792259218/
http://www.flickr.com/photos/jayshep5/5792259218/
// composer.josn
{
    "name": "monolog/monolog",
    "require": {
        "php": ">=5.3.0"
    },
}
// composer.josn
{
    "name": "monolog/monolog",
    "require": {
        "php": ">=5.3.0"
    },
}
// composer.josn
{
    "name": "monolog/monolog",
    "require": {
        "php": ">=5.3.0"
    },
}
// composer.josn
{
    "name": "monolog/monolog",
    "require": {
        "php": ">=5.3.0"
    },
}
// composer.josn
{
    "name": "monolog/monolog",
    "require": {
        "php": ">=5.3.0"
    },
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    "type": "library",
    "description": "Logging for PHP 5.3",
    "keywords": ["log","logging"],
    "homepage": "http://github.com/Seldaek/monolog",
    "license": "MIT",
    "authors": [
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Monolog": "src"
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    [ ... ]
    "autoload": {
        "psr-0": {
            "Monolog": ["src", "lib"]
        }
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    [ ... ]
    "autoload": {
        "classmap": ["src", "lib"]
    }
}
// composer.josn
{
    "name": "monolog/monolog",
    [ ... ]
    "autoload": {
        "files": "src/myfunctions.php"
    }
}
Shifting gears with Composer
Excuse #1

I need to use a patched version of
Symfony
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "http://github.com/loalf/symfony"
     }
  ],
  "require": {
     "symfony/symfony" : "dev-patch2"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "http://github.com/loalf/symfony"
     }
  ],
  "require": {
     "symfony/symfony" : "dev-patch2"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "http://github.com/loalf/symfony"
     }
  ],
  "require": {
     "symfony/symfony" : "dev-patch2"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "http://github.com/loalf/symfony"
     }
  ],
  "require": {
     "symfony/symfony" : "dev-patch2"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "http://github.com/loalf/symfony"
     }
  ],
  "require": {
     "symfony/symfony" : "dev-patch2"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "http://github.com/loalf/symfony"
     }
  ],
  "require": {
     "symfony/symfony" : "dev-patch2"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "http://github.com/loalf/symfony"
     }
  ],
  "require": {
     "symfony/symfony" : "dev-patch2"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "http://github.com/loalf/symfony"
     }
  ],
  "require": {
     "symfony/symfony" : "dev-patch2"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "http://github.com/loalf/symfony"
     }
  ],
  "require": {
     "symfony/symfony" : "dev-patch2"
  }
}
Excuse #2

Some dependecies are in my own
private SVN repo
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "svn://company.com/lib"
     }
  ],
  "require": {
     "company/lib" : "1.2.1"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "svn://company.com/lib"
     }
  ],
  "require": {
     "company/lib" : "1.2.1"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "svn://company.com/lib"
     }
  ],
  "require": {
     "company/lib" : "1.2.1"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "svn://company.com/lib"
     }
  ],
  "require": {
     "company/lib" : "1.2.1"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "svn://company.com/lib"
     }
  ],
  "require": {
     "company/lib" : "1.2.1"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "svn://company.com/lib"
     }
  ],
  "require": {
     "company/lib" : "1.2.1"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "svn://company.com/lib"
     }
  ],
  "require": {
     "company/lib" : "1.2.1"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "svn://company.com/lib"
     }
  ],
  "require": {
     "company/lib" : "1.2.1"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "cvs",
       "url" : "svn://company.com/lib"
     }
  ],
  "require": {
     "company/lib" : "1.2.1"
  }
}
Excuse #3

I am using PEAR, you said I could
use PEAR
// composer.json
{
  "repositories": [
     {
       "type" : "pear",
       "url" : "http://pear2.php.net"
     }
  ],
  "require": {
     "pear-pear2/PEAR2_HTTP_Request" : "*"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "pear",
       "url" : "http://pear2.php.net"
     }
  ],
  "require": {
     "pear-pear2/PEAR2_HTTP_Request" : "*"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "pear",
       "url" : "http://pear2.php.net"
     }
  ],
  "require": {
     "pear-pear2/PEAR2_HTTP_Request" : "*"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "pear",
       "url" : "http://pear2.php.net"
     }
  ],
  "require": {
     "pear-pear2/PEAR2_HTTP_Request" : "*"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "pear",
       "url" : "http://pear2.php.net"
     }
  ],
  "require": {
     "pear-pear2/PEAR2_HTTP_Request" : "*"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "pear",
       "url" : "http://pear2.php.net"
     }
  ],
  "require": {
     "pear-pear2/PEAR2_HTTP_Request" : "*"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "pear",
       "url" : "http://pear2.php.net"
     }
  ],
  "require": {
     "pear-pear2/PEAR2_HTTP_Request" : "*"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "pear",
       "url" : "http://pear2.php.net"
     }
  ],
  "require": {
     "pear-pear2/PEAR2_HTTP_Request" : "*"
  }
}
// composer.json
{
  "repositories": [
     {
       "type" : "pear",
       "url" : "http://pear2.php.net"
     }
  ],
  "require": {
     "pear-pear2/PEAR2_HTTP_Request" : "*"
  }
}
Excuse #4

My origin doesn´t have a
composer.json file
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
// composer.json
{
  "repositories" : [
     {
       "type": "package",
       "package": {
         "name": "jquery/jquery",
         "version": "1.7.2",
         "dist": {
           "url": "http://code.jquery.com/jquery-1.7.2.js",
           "type": "file"
         }
       }
     }
  ],
  "require" : {
     "jquery/jquery" : "1.7.2"
  }
}
Excuse #5

I need a private package
repository, but Packagist is too
demanding
Satis

http://getcomposer.org/doc/articles/handling-private-
              packages-with-satis.md
Reasons to   composer
1200     250
watchs   forks
Shifting gears with Composer
Shifting gears with Composer
2703


                                                                                  2418




                         2703                                             1881




                         packages                                1447




                                                         1004


                                                692

                                         478
                                347
                         204
                 139
2011-09   48   2011-11         2012-01         2012-03          2012-05          2012-07
   7
2703


                                                                                  2418




                         2703                                             1881




                         packages                                1447




                                                         1004


                                                692

                                         478
                                347



                                                                                                  287
                         204
                 139
2011-09   48   2011-11         2012-01         2012-03          2012-05          2012-07
   7




                                                                                                  588
+2.5 mill packages installed
                   since 2012-04-13
Shifting gears with Composer
Resources
Resources

• getcomposer.org
Resources

• getcomposer.org
• packagist.org
Resources

• getcomposer.org
• packagist.org
• github.com/composer
Thanks!
 Questions?



              Javier Lopez (@loalf)

More Related Content

PDF
Git::Hooks
PDF
Composer the right way - SunshinePHP
KEY
PHPで文字コードとエラーメッセージをコントロールする
PDF
DO YOU WANT TO USE A VCS
KEY
Rails Presentation (Anton Dmitriyev)
PDF
Git inter-snapshot public
PPTX
ZfDayIt 2014 - There is a module for everything
PPTX
Vagrant - PugMI
Git::Hooks
Composer the right way - SunshinePHP
PHPで文字コードとエラーメッセージをコントロールする
DO YOU WANT TO USE A VCS
Rails Presentation (Anton Dmitriyev)
Git inter-snapshot public
ZfDayIt 2014 - There is a module for everything
Vagrant - PugMI

What's hot (20)

PDF
Mojolicious and REST
PDF
Beyond Phoenix
PDF
Git introduction
PDF
Learning Python from Data
PDF
Composer 經典食譜
PPTX
Jedi Mind Tricks for Git
PDF
AWS SDK for PHP のインストールから 始めるクラウドマスターへの道 〜 Promise による非同期オペレーション 〜
PDF
Java 9 – The Ultimate Feature List
PDF
Tracking huge files with Git LFS (GlueCon 2016)
PDF
Let the contribution begin
PDF
Composer the Right Way - PHPBNL16
PDF
Jedi Mind Tricks in Git
PDF
Free The Enterprise With Ruby & Master Your Own Domain
KEY
Plack perl superglue for web frameworks and servers
PDF
Painless Data Storage with MongoDB & Go
PDF
Composer The Right Way - 010PHP
PPTX
Web backends development using Python
PDF
Tracking large game assets with Git LFS
PDF
Composer the right way [SweetlakePHP]
Mojolicious and REST
Beyond Phoenix
Git introduction
Learning Python from Data
Composer 經典食譜
Jedi Mind Tricks for Git
AWS SDK for PHP のインストールから 始めるクラウドマスターへの道 〜 Promise による非同期オペレーション 〜
Java 9 – The Ultimate Feature List
Tracking huge files with Git LFS (GlueCon 2016)
Let the contribution begin
Composer the Right Way - PHPBNL16
Jedi Mind Tricks in Git
Free The Enterprise With Ruby & Master Your Own Domain
Plack perl superglue for web frameworks and servers
Painless Data Storage with MongoDB & Go
Composer The Right Way - 010PHP
Web backends development using Python
Tracking large game assets with Git LFS
Composer the right way [SweetlakePHP]
Ad

Viewers also liked (6)

PPTX
Project kwaliteit en implementatie van vraagsturing
PDF
Novedades en Symfony 2.3
PPT
Young, phillip open source nos
PPT
C:\Fakepath\Denis Keenan Rvr Presentation July 2010
PDF
Slides components en
PPS
D:\投資大師羅傑斯給寶貝女兒的12封信讀後感
Project kwaliteit en implementatie van vraagsturing
Novedades en Symfony 2.3
Young, phillip open source nos
C:\Fakepath\Denis Keenan Rvr Presentation July 2010
Slides components en
D:\投資大師羅傑斯給寶貝女兒的12封信讀後感
Ad

Similar to Shifting gears with Composer (20)

PDF
Mastering composer
PPT
Composer - Package Management for PHP. Silver Bullet?
KEY
Composer
PDF
Composer - The missing package manager for PHP
PDF
Composer for Busy Developers - php|tek13
PDF
Composer the right way
PDF
Composer: putting dependencies on the score
ZIP
Mojolicious
PDF
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
PDF
Composer for busy developers - DPC13
PDF
How to deploy PHP projects with docker
PDF
Composer The Right Way
PDF
Composer the right way - DPC15
PDF
Composer The Right Way #PHPjhb15
PDF
Automate Yo'self -- SeaGL
PDF
Composer the right way - NomadPHP
KEY
Linecook - A Chef Alternative
PDF
Transforming WebSockets
PDF
Steam Learn: Composer
PDF
Os Treat
Mastering composer
Composer - Package Management for PHP. Silver Bullet?
Composer
Composer - The missing package manager for PHP
Composer for Busy Developers - php|tek13
Composer the right way
Composer: putting dependencies on the score
Mojolicious
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
Composer for busy developers - DPC13
How to deploy PHP projects with docker
Composer The Right Way
Composer the right way - DPC15
Composer The Right Way #PHPjhb15
Automate Yo'self -- SeaGL
Composer the right way - NomadPHP
Linecook - A Chef Alternative
Transforming WebSockets
Steam Learn: Composer
Os Treat

More from Javier López (7)

PDF
Continous Delivering a PHP application
PDF
One commit, one release. Continuously delivering a Symfony project.
PDF
PHP's FIG and PSRs
PDF
Slides changes symfony23
PDF
Componentes, el arma secreta de Symfony2
KEY
Slides componentes
ODP
Symfony y Admin Generator
Continous Delivering a PHP application
One commit, one release. Continuously delivering a Symfony project.
PHP's FIG and PSRs
Slides changes symfony23
Componentes, el arma secreta de Symfony2
Slides componentes
Symfony y Admin Generator

Recently uploaded (20)

PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Empathic Computing: Creating Shared Understanding
PPTX
Big Data Technologies - Introduction.pptx
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
KodekX | Application Modernization Development
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Electronic commerce courselecture one. Pdf
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
Diabetes mellitus diagnosis method based random forest with bat algorithm
Empathic Computing: Creating Shared Understanding
Big Data Technologies - Introduction.pptx
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Building Integrated photovoltaic BIPV_UPV.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
KodekX | Application Modernization Development
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Chapter 3 Spatial Domain Image Processing.pdf
Network Security Unit 5.pdf for BCA BBA.
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
20250228 LYD VKU AI Blended-Learning.pptx
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
Electronic commerce courselecture one. Pdf
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Review of recent advances in non-invasive hemoglobin estimation
The Rise and Fall of 3GPP – Time for a Sabbatical?

Shifting gears with Composer

  • 1. Shifting gears with Composer Javier Lopez (@loalf)
  • 3. Who am I? • I am from Spain
  • 4. Who am I? • I am from Spain • I live in London
  • 5. Who am I? • I am from Spain • I live in London • I work for IPC Media
  • 6. Who am I? • I am from Spain • I live in London • I work for IPC Media • I tweet as @loalf
  • 7. Who am I? • I am from Spain • I live in London • I work for IPC Media • I tweet as @loalf • I co-organize DeSymfony (www.desymfony.com)
  • 8. Who am I? • I am from Spain • I live in London • I work for IPC Media • I tweet as @loalf • I co-organize DeSymfony (www.desymfony.com) Still want to know more? http://www.linkedin.com/in/loalf
  • 15. 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.
  • 17. Is it a new concept?
  • 18. Is it a new concept? Nope.
  • 19. Is it a new concept? Nope. Node Package Manager
  • 20. Is it a new concept? Nope. Node Package Manager Ruby Package Manager
  • 23. But, what about PEAR? • You have to install it in all the system
  • 24. But, what about PEAR? • You have to install it in all the system • You can´t see the source code
  • 25. But, what about PEAR? • You have to install it in all the system • You can´t see the source code • Don´t allow different repository sources
  • 26. But, what about PEAR? • You have to install it in all the system • You can´t see the source code • Don´t allow different repository sources • Composer is compatible with PEAR, :)
  • 30. Installing Composer (locally) mkdir myprojectname cd myprojectname
  • 31. Installing Composer (locally) mkdir myprojectname cd myprojectname curl -s https://getcomposer.org/installer | php
  • 32. Installing Composer (locally) mkdir myprojectname cd myprojectname curl -s https://getcomposer.org/installer | php Done!
  • 33. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 34. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 35. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 36. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 37. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 38. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 39. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 40. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 41. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 42. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 43. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 44. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 45. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 46. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 47. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 48. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 49. // composer.json { "require" : { "monolog/monolog" : "1.0.*", "symfony/translation" : "2.1.0-RC1", "behat/behat" : ">2.3.5,<2.4", "fabpot/goutte" : "dev-master" }, "minimum-stability": "dev" }
  • 51. Installing dependencies - Installing guzzle/parser (v2.8.4) Downloading: 100% - Installing symfony/event-dispatcher (dev-master) Cloning v2.1.0-BETA4 - Installing guzzle/common (v2.8.4) Downloading: 100% - Installing guzzle/http (v2.8.4) Downloading: 100% - Installing symfony/process (dev-master) Cloning v2.1.0-RC1 - Installing symfony/finder (dev-master) Cloning 1af11ab3a686f9c45f2a8d9d721d5717cdd5f1d6
  • 52. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 53. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 54. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 55. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 56. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 57. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 58. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 59. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 60. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 61. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 62. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 63. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 64. !"" composer.json !"" composer.lock #"" vendor !"" autoload.php !"" behat !"" bin !"" composer !"" fabpot !"" guzzle !"" monolog #"" symfony
  • 65. http://www.packagist.org http://www.flickr.com/photos/jayshep5/5792259218/
  • 68. // composer.josn { "name": "monolog/monolog", "require": { "php": ">=5.3.0" }, }
  • 69. // composer.josn { "name": "monolog/monolog", "require": { "php": ">=5.3.0" }, }
  • 70. // composer.josn { "name": "monolog/monolog", "require": { "php": ">=5.3.0" }, }
  • 71. // composer.josn { "name": "monolog/monolog", "require": { "php": ">=5.3.0" }, }
  • 72. // composer.josn { "name": "monolog/monolog", "require": { "php": ">=5.3.0" }, }
  • 73. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 74. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 75. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 76. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 77. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 78. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 79. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 80. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 81. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 82. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 83. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 84. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 85. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 86. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 87. // composer.josn { "name": "monolog/monolog", "type": "library", "description": "Logging for PHP 5.3", "keywords": ["log","logging"], "homepage": "http://github.com/Seldaek/monolog", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be", "role": "Developer" } ], "require": { "php": ">=5.3.0" }, "autoload": { "psr-0": { "Monolog": "src" } } }
  • 88. // composer.josn { "name": "monolog/monolog", [ ... ] "autoload": { "psr-0": { "Monolog": ["src", "lib"] } } }
  • 89. // composer.josn { "name": "monolog/monolog", [ ... ] "autoload": { "classmap": ["src", "lib"] } }
  • 90. // composer.josn { "name": "monolog/monolog", [ ... ] "autoload": { "files": "src/myfunctions.php" } }
  • 92. Excuse #1 I need to use a patched version of Symfony
  • 93. // composer.json { "repositories": [ { "type" : "cvs", "url" : "http://github.com/loalf/symfony" } ], "require": { "symfony/symfony" : "dev-patch2" } }
  • 94. // composer.json { "repositories": [ { "type" : "cvs", "url" : "http://github.com/loalf/symfony" } ], "require": { "symfony/symfony" : "dev-patch2" } }
  • 95. // composer.json { "repositories": [ { "type" : "cvs", "url" : "http://github.com/loalf/symfony" } ], "require": { "symfony/symfony" : "dev-patch2" } }
  • 96. // composer.json { "repositories": [ { "type" : "cvs", "url" : "http://github.com/loalf/symfony" } ], "require": { "symfony/symfony" : "dev-patch2" } }
  • 97. // composer.json { "repositories": [ { "type" : "cvs", "url" : "http://github.com/loalf/symfony" } ], "require": { "symfony/symfony" : "dev-patch2" } }
  • 98. // composer.json { "repositories": [ { "type" : "cvs", "url" : "http://github.com/loalf/symfony" } ], "require": { "symfony/symfony" : "dev-patch2" } }
  • 99. // composer.json { "repositories": [ { "type" : "cvs", "url" : "http://github.com/loalf/symfony" } ], "require": { "symfony/symfony" : "dev-patch2" } }
  • 100. // composer.json { "repositories": [ { "type" : "cvs", "url" : "http://github.com/loalf/symfony" } ], "require": { "symfony/symfony" : "dev-patch2" } }
  • 101. // composer.json { "repositories": [ { "type" : "cvs", "url" : "http://github.com/loalf/symfony" } ], "require": { "symfony/symfony" : "dev-patch2" } }
  • 102. Excuse #2 Some dependecies are in my own private SVN repo
  • 103. // composer.json { "repositories": [ { "type" : "cvs", "url" : "svn://company.com/lib" } ], "require": { "company/lib" : "1.2.1" } }
  • 104. // composer.json { "repositories": [ { "type" : "cvs", "url" : "svn://company.com/lib" } ], "require": { "company/lib" : "1.2.1" } }
  • 105. // composer.json { "repositories": [ { "type" : "cvs", "url" : "svn://company.com/lib" } ], "require": { "company/lib" : "1.2.1" } }
  • 106. // composer.json { "repositories": [ { "type" : "cvs", "url" : "svn://company.com/lib" } ], "require": { "company/lib" : "1.2.1" } }
  • 107. // composer.json { "repositories": [ { "type" : "cvs", "url" : "svn://company.com/lib" } ], "require": { "company/lib" : "1.2.1" } }
  • 108. // composer.json { "repositories": [ { "type" : "cvs", "url" : "svn://company.com/lib" } ], "require": { "company/lib" : "1.2.1" } }
  • 109. // composer.json { "repositories": [ { "type" : "cvs", "url" : "svn://company.com/lib" } ], "require": { "company/lib" : "1.2.1" } }
  • 110. // composer.json { "repositories": [ { "type" : "cvs", "url" : "svn://company.com/lib" } ], "require": { "company/lib" : "1.2.1" } }
  • 111. // composer.json { "repositories": [ { "type" : "cvs", "url" : "svn://company.com/lib" } ], "require": { "company/lib" : "1.2.1" } }
  • 112. Excuse #3 I am using PEAR, you said I could use PEAR
  • 113. // composer.json { "repositories": [ { "type" : "pear", "url" : "http://pear2.php.net" } ], "require": { "pear-pear2/PEAR2_HTTP_Request" : "*" } }
  • 114. // composer.json { "repositories": [ { "type" : "pear", "url" : "http://pear2.php.net" } ], "require": { "pear-pear2/PEAR2_HTTP_Request" : "*" } }
  • 115. // composer.json { "repositories": [ { "type" : "pear", "url" : "http://pear2.php.net" } ], "require": { "pear-pear2/PEAR2_HTTP_Request" : "*" } }
  • 116. // composer.json { "repositories": [ { "type" : "pear", "url" : "http://pear2.php.net" } ], "require": { "pear-pear2/PEAR2_HTTP_Request" : "*" } }
  • 117. // composer.json { "repositories": [ { "type" : "pear", "url" : "http://pear2.php.net" } ], "require": { "pear-pear2/PEAR2_HTTP_Request" : "*" } }
  • 118. // composer.json { "repositories": [ { "type" : "pear", "url" : "http://pear2.php.net" } ], "require": { "pear-pear2/PEAR2_HTTP_Request" : "*" } }
  • 119. // composer.json { "repositories": [ { "type" : "pear", "url" : "http://pear2.php.net" } ], "require": { "pear-pear2/PEAR2_HTTP_Request" : "*" } }
  • 120. // composer.json { "repositories": [ { "type" : "pear", "url" : "http://pear2.php.net" } ], "require": { "pear-pear2/PEAR2_HTTP_Request" : "*" } }
  • 121. // composer.json { "repositories": [ { "type" : "pear", "url" : "http://pear2.php.net" } ], "require": { "pear-pear2/PEAR2_HTTP_Request" : "*" } }
  • 122. Excuse #4 My origin doesn´t have a composer.json file
  • 123. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 124. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 125. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 126. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 127. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 128. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 129. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 130. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 131. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 132. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 133. // composer.json { "repositories" : [ { "type": "package", "package": { "name": "jquery/jquery", "version": "1.7.2", "dist": { "url": "http://code.jquery.com/jquery-1.7.2.js", "type": "file" } } } ], "require" : { "jquery/jquery" : "1.7.2" } }
  • 134. Excuse #5 I need a private package repository, but Packagist is too demanding
  • 136. Reasons to composer
  • 137. 1200 250 watchs forks
  • 140. 2703 2418 2703 1881 packages 1447 1004 692 478 347 204 139 2011-09 48 2011-11 2012-01 2012-03 2012-05 2012-07 7
  • 141. 2703 2418 2703 1881 packages 1447 1004 692 478 347 287 204 139 2011-09 48 2011-11 2012-01 2012-03 2012-05 2012-07 7 588
  • 142. +2.5 mill packages installed since 2012-04-13
  • 148. Thanks! Questions? Javier Lopez (@loalf)