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.
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
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, :)
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"
    }
}
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
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
Resources
Resources

• getcomposer.org
Resources

• getcomposer.org
• packagist.org
Resources

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



              Javier Lopez (@loalf)

Shifting gears with Composer

  • 1.
    Shifting gears with Composer Javier Lopez (@loalf)
  • 2.
  • 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
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
    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.
  • 17.
    Is it anew concept?
  • 18.
    Is it anew concept? Nope.
  • 19.
    Is it anew concept? Nope. Node Package Manager
  • 20.
    Is it anew concept? Nope. Node Package Manager Ruby Package Manager
  • 22.
  • 23.
    But, what aboutPEAR? • You have to install it in all the system
  • 24.
    But, what aboutPEAR? • You have to install it in all the system • You can´t see the source code
  • 25.
    But, what aboutPEAR? • 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 aboutPEAR? • 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, :)
  • 28.
  • 29.
  • 30.
    Installing Composer (locally) mkdirmyprojectname cd myprojectname
  • 31.
    Installing Composer (locally) mkdirmyprojectname cd myprojectname curl -s https://getcomposer.org/installer | php
  • 32.
    Installing Composer (locally) mkdirmyprojectname 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" }
  • 50.
  • 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/
  • 66.
  • 67.
  • 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 needto 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 dependeciesare 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 amusing 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 origindoesn´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 needa private package repository, but Packagist is too demanding
  • 135.
  • 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 packagesinstalled since 2012-04-13
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
    Thanks! Questions? Javier Lopez (@loalf)