SlideShare a Scribd company logo
Rafael Dohms / @rdohms




C!"p#$r
   Putting your dependencies on the score
Rafael Dohms




                           photo credit: Eli White
        @rdohms


 Evangelist, Speaker and
      Contributor.

Developer at WEBclusive.

Enabler at AmsterdamPHP.
%$ E&$v'(!r P)(*+
     a general introduction to Composer




     Ev$r,-', *!"p#)./
      the basic stuff you need to know




  Up/r'-)./ (! ' M'$0(r!
advanced features for more complex scenarios




       1.-)./ ,!2r (2.$
      discovering and sharing libraries
%$ E&$v'(!r P)(*+
per project          system wide
central repository   spread out channels
open acceptance        strict standards
Pr!b&$":
I need my team and my deployments to use consistent
      versions of the dependencies of my project
Pr!b&$":
I need my team and my deployments to use consistent
      versions of the dependencies of my project


S!&2()!.:
Pr!b&$":
I need my team and my deployments to use consistent
      versions of the dependencies of my project


S!&2()!.:
                       PEAR
Pr!b&$":
I need my team and my deployments to use consistent
      versions of the dependencies of my project


S!&2()!.:
                      PEAR
                   SVN Externals
Pr!b&$":
I need my team and my deployments to use consistent
      versions of the dependencies of my project


S!&2()!.:
                       PEAR
                   SVN Externals
                  Git Submodules
Pr!b&$":
I need my team and my deployments to use consistent
      versions of the dependencies of my project


S!&2()!.:
                      PEAR
                  SVN Externals
                 Git Submodules
             vendor management script
Pr!b&$":
I need my team and my deployments to use consistent
      versions of the dependencies of my project


S!&2()!.:
                      PEAR
                  SVN Externals
                 Git Submodules
             vendor management script


                  C!"p#$r!
A per-project dependency
  manager that allows you to
  declare a consistent list of
dependencies and versions for
 your application, as well as a
consistent way of sharing your
  libraries and making them
      discoverable using
         packagist.org
Ev$r,-', C!"p#)./
I.0('&&)./ C!"p#$r

Local (embed)
$ curl -s http://getcomposer.org/installer | php


Global
$ curl -s http://getcomposer.org/installer | php -- --install-dir=bin
I.0('&&)./ C!"p#$r

Local (embed)
$ curl -s http://getcomposer.org/installer | php


Global
$ curl -s http://getcomposer.org/installer | php -- --install-dir=bin




       3p:    $ ln -s /usr/bin/composer.phar /usr/bin/composer
I.0('&&)./ C!"p#$r
I.0('&&)./ C!"p#$r



  $ composer.phar --version
  Composer version 6573fd3
I.0('&&)./ C!"p#$r


     php

  $ composer.phar --version
  Composer version 6573fd3
K$$p )( 2p-'($-!
K$$p )( 2p-'($-!



$ composer.phar self-update

Updating to version 65e95ed.
    Downloading: 100%
C!"p#$r 101
C!"p#$r 101

$ cd ~/dev/myproject
C!"p#$r 101

$ cd ~/dev/myproject
$ vim composer.json



    {
        "require": {
            "silex/silex": "1.0.*"
        },

        "minimum-stability": "dev"
    }
C!"p#$r 101

$ cd ~/dev/myproject
$ vim composer.json       note: project root




    {
        "require": {
            "silex/silex": "1.0.*"
        },

        "minimum-stability": "dev"
    }
C!"p#$r 101

$ cd ~/dev/myproject
$ vim composer.json       note: project root



                                         “require”: required packages and versions
    {
        "require": {
                                                adv. ex.: >=1.0.0,<1.2-dev
            "silex/silex": "1.0.*"
        },

        "minimum-stability": "dev"
    }
C!"p#$r 101

$ cd ~/dev/myproject
$ vim composer.json       note: project root



                                         “require”: required packages and versions
    {
        "require": {
                                                 adv. ex.: >=1.0.0,<1.2-dev
            "silex/silex": "1.0.*"
        },

        "minimum-stability": "dev"       “minimum-stability”: if you only want stable
    }                                                    packages

                                                       default: stable
C!"p#$r 101

$ cd ~/dev/myproject
$ vim composer.json        note: project root



                                          “require”: required packages and versions
    {
        "require": {
                                                  adv. ex.: >=1.0.0,<1.2-dev
            "silex/silex": "1.0.*"
        },

        "minimum-stability": "dev"        “minimum-stability”: if you only want stable
    }                                                     packages

                                                        default: stable


$ composer.phar install
Installing dependencies
  - Installing pimple/pimple (dev-master)
    Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be

  - Installing symfony/routing (dev-master)
    Cloning 6bca82c3ea0d42d750de4f49b22020dfd047dc0f

  - Installing symfony/http-foundation (dev-master)
    Cloning 498c2da9c3fecefc7e3b0add73621f3feb337ddd

  - Installing symfony/event-dispatcher (dev-master)
    Cloning b99b49760016467099f010aff7a5098861d49e09

  - Installing symfony/http-kernel (dev-master)
    Cloning 7f671472f009231f9c1f5ec9b81fc6fbfcd9a955

  - Installing silex/silex (dev-master)
    Cloning 18e248a277adb061602d2bcabe96011db1c76ec0

symfony/routing suggests installing symfony/config (dev-master)
symfony/routing suggests installing symfony/yaml (dev-master)
symfony/routing suggests installing doctrine/common (>=2.2,<2.4-dev)
symfony/event-dispatcher suggests installing symfony/dependency-injection (dev-master)
symfony/http-kernel suggests installing symfony/browser-kit (dev-master)
symfony/http-kernel suggests installing symfony/class-loader (dev-master)
symfony/http-kernel suggests installing symfony/config (dev-master)
symfony/http-kernel suggests installing symfony/console (dev-master)
symfony/http-kernel suggests installing symfony/dependency-injection (dev-master)
symfony/http-kernel suggests installing symfony/finder (dev-master)
silex/silex suggests installing symfony/browser-kit (2.1.*)
silex/silex suggests installing symfony/css-selector (2.1.*)
silex/silex suggests installing symfony/dom-crawler (2.1.*)
Writing lock file
Generating autoload files
Installing dependencies
  - Installing pimple/pimple (dev-master)
    Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be

  - Installing symfony/routing (dev-master)
    Cloning 6bca82c3ea0d42d750de4f49b22020dfd047dc0f

  - Installing symfony/http-foundation (dev-master)
                                                          your dependency’s dependencies
    Cloning 498c2da9c3fecefc7e3b0add73621f3feb337ddd

  - Installing symfony/event-dispatcher (dev-master)
    Cloning b99b49760016467099f010aff7a5098861d49e09

  - Installing symfony/http-kernel (dev-master)
    Cloning 7f671472f009231f9c1f5ec9b81fc6fbfcd9a955

  - Installing silex/silex (dev-master)
    Cloning 18e248a277adb061602d2bcabe96011db1c76ec0

symfony/routing suggests installing symfony/config (dev-master)
symfony/routing suggests installing symfony/yaml (dev-master)
symfony/routing suggests installing doctrine/common (>=2.2,<2.4-dev)
symfony/event-dispatcher suggests installing symfony/dependency-injection (dev-master)
symfony/http-kernel suggests installing symfony/browser-kit (dev-master)
symfony/http-kernel suggests installing symfony/class-loader (dev-master)
symfony/http-kernel suggests installing symfony/config (dev-master)
symfony/http-kernel suggests installing symfony/console (dev-master)
symfony/http-kernel suggests installing symfony/dependency-injection (dev-master)
symfony/http-kernel suggests installing symfony/finder (dev-master)
silex/silex suggests installing symfony/browser-kit (2.1.*)
silex/silex suggests installing symfony/css-selector (2.1.*)
silex/silex suggests installing symfony/dom-crawler (2.1.*)
Writing lock file
Generating autoload files
Installing dependencies
  - Installing pimple/pimple (dev-master)
    Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be

  - Installing symfony/routing (dev-master)
    Cloning 6bca82c3ea0d42d750de4f49b22020dfd047dc0f

  - Installing symfony/http-foundation (dev-master)
                                                          your dependency’s dependencies
    Cloning 498c2da9c3fecefc7e3b0add73621f3feb337ddd

  - Installing symfony/event-dispatcher (dev-master)
    Cloning b99b49760016467099f010aff7a5098861d49e09

  - Installing symfony/http-kernel (dev-master)
    Cloning 7f671472f009231f9c1f5ec9b81fc6fbfcd9a955

  - Installing silex/silex (dev-master)
    Cloning 18e248a277adb061602d2bcabe96011db1c76ec0              your dependency

symfony/routing suggests installing symfony/config (dev-master)
symfony/routing suggests installing symfony/yaml (dev-master)
symfony/routing suggests installing doctrine/common (>=2.2,<2.4-dev)
symfony/event-dispatcher suggests installing symfony/dependency-injection (dev-master)
symfony/http-kernel suggests installing symfony/browser-kit (dev-master)
symfony/http-kernel suggests installing symfony/class-loader (dev-master)
symfony/http-kernel suggests installing symfony/config (dev-master)
symfony/http-kernel suggests installing symfony/console (dev-master)
symfony/http-kernel suggests installing symfony/dependency-injection (dev-master)
symfony/http-kernel suggests installing symfony/finder (dev-master)
silex/silex suggests installing symfony/browser-kit (2.1.*)
silex/silex suggests installing symfony/css-selector (2.1.*)
silex/silex suggests installing symfony/dom-crawler (2.1.*)
Writing lock file
Generating autoload files
Installing dependencies
  - Installing pimple/pimple (dev-master)
    Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be

  - Installing symfony/routing (dev-master)
    Cloning 6bca82c3ea0d42d750de4f49b22020dfd047dc0f

  - Installing symfony/http-foundation (dev-master)
                                                          your dependency’s dependencies
    Cloning 498c2da9c3fecefc7e3b0add73621f3feb337ddd

  - Installing symfony/event-dispatcher (dev-master)
    Cloning b99b49760016467099f010aff7a5098861d49e09

  - Installing symfony/http-kernel (dev-master)
    Cloning 7f671472f009231f9c1f5ec9b81fc6fbfcd9a955

  - Installing silex/silex (dev-master)
    Cloning 18e248a277adb061602d2bcabe96011db1c76ec0              your dependency

symfony/routing suggests installing symfony/config (dev-master)
symfony/routing suggests installing symfony/yaml (dev-master)
symfony/routing suggests installing doctrine/common (>=2.2,<2.4-dev)
symfony/event-dispatcher suggests installing symfony/dependency-injection (dev-master)
symfony/http-kernel suggests installing symfony/browser-kit (dev-master)
symfony/http-kernel suggests installing symfony/class-loader (dev-master)
symfony/http-kernel suggests installing symfony/config (dev-master)
symfony/http-kernel suggests installing symfony/console (dev-master)
symfony/http-kernel suggests installing symfony/dependency-injection (dev-master)
symfony/http-kernel suggests installing symfony/finder (dev-master)
silex/silex suggests installing symfony/browser-kit (2.1.*)
silex/silex suggests installing symfony/css-selector (2.1.*)
silex/silex suggests installing symfony/dom-crawler (2.1.*)     suggestions of other packages,
Writing lock file
Generating autoload files
                                                                      for further features
P)*42p (+$ ($"p!!
Let Composer bootstrap you development
B!!(0(r'pp)./ Pr!5$*(0

$ composer.phar create-project fabpot/silex-skeleton ~/dev/myproject
B!!(0(r'pp)./ Pr!5$*(0

$ composer.phar create-project fabpot/silex-skeleton ~/dev/myproject




Installing fabpot/silex-skeleton (dev-master cc19d406cf3cac253715db92d400992d4f3e1b52)
  - Installing fabpot/silex-skeleton (dev-master)
    Cloning master

Created project in one-liner/
Installing dependencies
  - Installing pimple/pimple (dev-master)
    Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be

  [...]

symfony/routing suggests installing symfony/yaml (dev-master)
[...]

Writing lock file
Generating autoload files
B!!(0(r'pp)./ Pr!5$*(0

$ composer.phar create-project fabpot/silex-skeleton ~/dev/myproject




Installing fabpot/silex-skeleton (dev-master cc19d406cf3cac253715db92d400992d4f3e1b52)
  - Installing fabpot/silex-skeleton (dev-master)
    Cloning master

Created project in one-liner/                                     myproje
                                                                          ct/
Installing dependencies                                             compose
  - Installing pimple/pimple (dev-master)                                   r.json
                                                                    compose
    Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be                        r.lock
                                                                    config/
  [...]                                                            console
                                                                           /
                                                                   src/
symfony/routing suggests installing symfony/yaml (dev-master)
                                                                   templat
[...]                                                                      es/
                                                                  vendor/
Writing lock file                                                 web/
Generating autoload files
I w'.( (! *!.(r)b2($ ' pr!5$*(
  Composer can set that up for you.
B!!(0(r'pp)./ C!.(r)b2()!.0

$ composer.phar create-project dms/dms --dev ~/dev/oss/dms
B!!(0(r'pp)./ C!.(r)b2()!.0
                                        gimme dev packages


$ composer.phar create-project dms/dms --dev ~/dev/oss/dms
B!!(0(r'pp)./ C!.(r)b2()!.0
                                        gimme dev packages


$ composer.phar create-project dms/dms --dev ~/dev/oss/dms




          "require-dev": {
              "symfony/symfony": ">=2.1-dev",
              "doctrine/orm":    "dev-master"
          },
B!!(0(r'pp)./ C!.(r)b2()!.0
                                                  gimme dev packages


$ composer.phar create-project dms/dms --dev ~/dev/oss/dms




          "require-dev": {
              "symfony/symfony": ">=2.1-dev",
              "doctrine/orm":    "dev-master"
          },
            “require-dev”: only needed if you are going
                           to contribute
H!w -! I 6.-/&!'- (+$ 6&$0?
  PSR-0 and the modern autoloader
Composer generates an
autoload file for all your
     dependencies
Composer generates an
autoload file for all your
     dependencies


   vendor/autoload.php
"autoload": {
    "psr-0": { "MyNamespace": "<root>" },



     "classmap": ["src/", "lib/", "Something.php"],



     "files": ["src/MyLibrary/functions.php"]

},
“autoload”: describes the autoloading needed for your library


"autoload": {
    "psr-0": { "MyNamespace": "<root>" },



     "classmap": ["src/", "lib/", "Something.php"],



     "files": ["src/MyLibrary/functions.php"]

},
“autoload”: describes the autoloading needed for your library


"autoload": {
    "psr-0": { "MyNamespace": "<root>" },                   “psr-0”: PSR-0 Compatible libraries



     "classmap": ["src/", "lib/", "Something.php"],



     "files": ["src/MyLibrary/functions.php"]

},
“autoload”: describes the autoloading needed for your library


"autoload": {
    "psr-0": { "MyNamespace": "<root>" },                   “psr-0”: PSR-0 Compatible libraries



                                             “classmap”: Old PEAR packages and other
     "classmap": ["src/", "lib/", "Something.php"],
                                                             libraries


     "files": ["src/MyLibrary/functions.php"]

},
“autoload”: describes the autoloading needed for your library


"autoload": {
    "psr-0": { "MyNamespace": "<root>" },                   “psr-0”: PSR-0 Compatible libraries



                                             “classmap”: Old PEAR packages and other
     "classmap": ["src/", "lib/", "Something.php"],
                                                             libraries


     "files": ["src/MyLibrary/functions.php"]
                                                         “files”: for php functions or initializations
},
I.0('&&)./, 2p-'()./ '.- "!v)./ !.
  how does Composer guarantee consistency
Composer: putting dependencies on the score
composer.json
“composer.json”: metadata and list of your
              dependencies.




composer.json
“composer.json”: metadata and list of your
              dependencies.




composer.json



composer.lock
“composer.json”: metadata and list of your
              dependencies.




composer.json



composer.lock



 “composer.lock”: existing dependencies and
          current commit hashes.
composer.json



composer.lock
update



         composer.json



         composer.lock
update                   install



         composer.json



         composer.lock
update                           install


         reads
                 composer.json



                 composer.lock
update                             install


         reads
                   composer.json



                   composer.lock




     gets latest
update                                    install


         reads
                          composer.json


                 writes
                          composer.lock




     gets latest
update                                       install


         reads                            reads

                          composer.json


                 writes
                          composer.lock




     gets latest
update                                         install


         reads                             reads

                          composer.json

                                          compares
                 writes
                          composer.lock




     gets latest
update                                              install


         reads                                  reads

                          composer.json

                                              compares
                 writes
                          composer.lock




     gets latest                          gets locked version
D$v$&!p)./ '. App ). ' ($'"?

 Commit you composer.lock file
  into the repository, and use
        composer install.
D$v$&!p)./ '. App ). ' ($'"?

 Commit you composer.lock file
  into the repository, and use
        composer install.

                  will ensure everyone is on
                       the same “page”
I’" -$v$&!p)./ ' &)br'r,, +$&p!
here are some fields you should care about
{
    "name": "vendor-namespace/package-name",
    "type": "symfony-bundle",
    "description": "A sample package for examples",
    "keywords": ["php", "package"],
    "homepage": "http://doh.ms",
    "license": "MIT",
    "support": {
        "email": "support@mylib.com",
        "issues": "http://issues.lib.com"
    }

    "target-dir": "/folder/to/install",
}
“name”: this should be unique, pick a good one!
{
    "name": "vendor-namespace/package-name",
    "type": "symfony-bundle",
    "description": "A sample package for examples",
    "keywords": ["php", "package"],
    "homepage": "http://doh.ms",
    "license": "MIT",
    "support": {
        "email": "support@mylib.com",
        "issues": "http://issues.lib.com"
    }

    "target-dir": "/folder/to/install",
}
“name”: this should be unique, pick a good one!
{
    "name": "vendor-namespace/package-name",
                                 “type”: will be used for more advanced
    "type": "symfony-bundle",                “custom”installs
    "description": "A sample package for examples",
    "keywords": ["php", "package"],
    "homepage": "http://doh.ms",
    "license": "MIT",
    "support": {
        "email": "support@mylib.com",
        "issues": "http://issues.lib.com"
    }

    "target-dir": "/folder/to/install",
}
“name”: this should be unique, pick a good one!
{
    "name": "vendor-namespace/package-name",
                                 “type”: will be used for more advanced
    "type": "symfony-bundle",                “custom”installs
    "description": "A sample package for examples",
    "keywords": ["php", "package"],
    "homepage": "http://doh.ms",
    "license": "MIT",                      “license”: very important!
    "support": {
        "email": "support@mylib.com",
        "issues": "http://issues.lib.com"
    }

    "target-dir": "/folder/to/install",
}
“name”: this should be unique, pick a good one!
{
    "name": "vendor-namespace/package-name",
                                 “type”: will be used for more advanced
    "type": "symfony-bundle",                “custom”installs
    "description": "A sample package for examples",
    "keywords": ["php", "package"],
    "homepage": "http://doh.ms",
    "license": "MIT",                      “license”: very important!
    "support": {
        "email": "support@mylib.com",
                                     “support”: point people the right way.
        "issues": "http://issues.lib.com"
    }

    "target-dir": "/folder/to/install",
}
“name”: this should be unique, pick a good one!
{
    "name": "vendor-namespace/package-name",
                                 “type”: will be used for more advanced
    "type": "symfony-bundle",                “custom”installs
    "description": "A sample package for examples",
    "keywords": ["php", "package"],
    "homepage": "http://doh.ms",
    "license": "MIT",                      “license”: very important!
    "support": {
        "email": "support@mylib.com",
                                     “support”: point people the right way.
        "issues": "http://issues.lib.com"
    }

    "target-dir": "/folder/to/install",
}

           “target-dir”: great for installing sub-dir splits repositories

                ex: Symfony Bundles: /Acme/Bundle/MyBundle
M, *!-$ )0 PHP 5.4 !.&,!
 managing system dependencies
{
    "require": {
        "php": ">=5.3.3",
        "ext-ldap": "*"
    }
}
{                     “php”: PHP version.
    "require": {
        "php": ">=5.3.3",
        "ext-ldap": "*"
    }
}
{                         “php”: PHP version.
    "require": {
        "php": ">=5.3.3",
        "ext-ldap": "*"
    }
}                “ext-*”: Presence of selected extension
Up/r'-)./ (! ' M'$0(r!
B2( I .$$- ' 0p$*)6* v$r0)!.
  version modifiers to the rescue!
Composer: putting dependencies on the score
"acme/foo": "1.0.x-dev#3ebbe75"
“#<ref>”: Get this specific commit


"acme/foo": "1.0.x-dev#3ebbe75"
“#<ref>”: Get this specific commit


"acme/foo": "1.0.x-dev#3ebbe75"




      "acme/foo": "@dev"
   "acme/foo": "1.0.*@beta"
“#<ref>”: Get this specific commit


"acme/foo": "1.0.x-dev#3ebbe75"




      "acme/foo": "@dev"
   "acme/foo": "1.0.*@beta"


    “@<state>”: Get a version outside
          your default stability
I .$$- (! 7$*2($ ' f$w 0*r)p(0
 how to automate tasks with Composer
    "scripts": {
        "post-install-cmd": [
            "SensioBundleDistributionBundleComposerScriptHandler::buildBootstrap",
            "SensioBundleDistributionBundleComposerScriptHandler::clearCache",
            "SensioBundleDistributionBundleComposerScriptHandler::installAssets",
            "SensioBundleDistributionBundleComposerScriptHandler::installRequirementsFile"
        ],
        "post-update-cmd": [
            "SensioBundleDistributionBundleComposerScriptHandler::buildBootstrap",
            "SensioBundleDistributionBundleComposerScriptHandler::clearCache",
            "SensioBundleDistributionBundleComposerScriptHandler::installAssets",
            "SensioBundleDistributionBundleComposerScriptHandler::installRequirementsFile"
        ]
    },
“scripts”: allows you to run scripts at given moments

    "scripts": {
        "post-install-cmd": [
            "SensioBundleDistributionBundleComposerScriptHandler::buildBootstrap",
            "SensioBundleDistributionBundleComposerScriptHandler::clearCache",
            "SensioBundleDistributionBundleComposerScriptHandler::installAssets",
            "SensioBundleDistributionBundleComposerScriptHandler::installRequirementsFile"
        ],
        "post-update-cmd": [
            "SensioBundleDistributionBundleComposerScriptHandler::buildBootstrap",
            "SensioBundleDistributionBundleComposerScriptHandler::clearCache",
            "SensioBundleDistributionBundleComposerScriptHandler::installAssets",
            "SensioBundleDistributionBundleComposerScriptHandler::installRequirementsFile"
        ]
    },
C20(!" R$p#)(!r)$0 !r .!
 C!"p#$r, w+'( .!w?
Injecting Composer into wild packages
“hero/superpackage”: “dev-master”
“hero/superpackage”: “dev-master”
“hero/superpackage”: “dev-master”
“hero/superpackage”: “dev-master”
“hero/superpackage”: “dev-master”




    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/rdohms/hero-superpackage"
        }       
    ]
“hero/superpackage”: “dev-master”




         “repositories”: point to non-indexed, override existing or on-
                                the-fly packages

    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/rdohms/hero-superpackage"
        }       
    ]
N!.-C!"p#$r P'*4'/$
{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "smarty/smarty",
                "version": "3.1.7",
                "dist": {
                    "url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
                    "type": "zip"
                },
                "source": {
                    "url": "http://smarty-php.googlecode.com/svn/",
                    "type": "svn",
                    "reference": "tags/Smarty_3_1_7/distribution/"
                }
            }
        }
    ]
}
N!.-C!"p#$r P'*4'/$
{
    "repositories": “package”: on-the-fly package, injecting a composer.json
                     [
        {
            "type": "package",
            "package": {
                "name": "smarty/smarty",
                "version": "3.1.7",
                "dist": {
                     "url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
                     "type": "zip"
                },
                "source": {
                     "url": "http://smarty-php.googlecode.com/svn/",
                     "type": "svn",
                     "reference": "tags/Smarty_3_1_7/distribution/"
                }
            }
        }
    ]
}
N!.-C!"p#$r P'*4'/$
{
    "repositories": “package”: on-the-fly package, injecting a composer.json
                     [
        {
            "type": "package",
            "package": {
                "name": "smarty/smarty",
                "version": "3.1.7",
                "dist": {
                     "url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
                     "type": "zip"                                           SVN / Git
                },
                "source": {
                     "url": "http://smarty-php.googlecode.com/svn/",
                     "type": "svn",
                     "reference": "tags/Smarty_3_1_7/distribution/"
                }
            }
        }
    ]
}
I .$$- (+)0 PEAR p'*4'/$...
         No Problem!
{
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear2.php.net"
        }
    ],
    "require": {
        "pear-pear2.php.net/PEAR2_Text_Markdown": "*",
        "pear-pear2/PEAR2_HTTP_Request": "*"
    }
}
{
    "repositories": [   “pear”: official PEAR and custom PEAR channels
        {
            "type": "pear",
            "url": "http://pear2.php.net"
        }
    ],
    "require": {
        "pear-pear2.php.net/PEAR2_Text_Markdown": "*",
        "pear-pear2/PEAR2_HTTP_Request": "*"
    }
}
{
    "repositories": [   “pear”: official PEAR and custom PEAR channels
        {
            "type": "pear",
            "url": "http://pear2.php.net"
        }
    ],
    "require": {
        "pear-pear2.php.net/PEAR2_Text_Markdown": "*",
        "pear-pear2/PEAR2_HTTP_Request": "*"
    }
}                Remember the prefix!
{
    "repositories": [   “pear”: official PEAR and custom PEAR channels
        {
            "type": "pear",
            "url": "http://pear2.php.net"
        }
    ],
    "require": {
        "pear-pear2.php.net/PEAR2_Text_Markdown": "*",
        "pear-pear2/PEAR2_HTTP_Request": "*"
    }
}                Remember the prefix!




                              !!   Warning: PEAR causes a overhead of requests
alias




replace   provide
alias

{
    "extra": {
        "branch-alias": {
            "dev-master": "1.0.x-dev"
        }
    },

    "require": {
        "monolog/monolog": "dev-bugfix as 1.0.x-dev"
    }
}




replace                                          provide
alias

{
    "extra": {
        "branch-alias": {
            "dev-master": "1.0.x-dev"
        }
    },

    "require": {
        "monolog/monolog": "dev-bugfix as 1.0.x-dev"
    }
}




replace                                          provide

  “replace”: allows you to
replace other packages, and
be used them in their place.
alias

{
    "extra": {
        "branch-alias": {
            "dev-master": "1.0.x-dev"
        }
    },

    "require": {
        "monolog/monolog": "dev-bugfix as 1.0.x-dev"
    }
}




replace                                          provide

  “replace”: allows you to                       “provide”: allows you to say
replace other packages, and                         a package provides a
be used them in their place.                            expectation.
1.-)./ ,!2r (2.$
I .$$- ' &)br'r, (+'( -!$0..
     Let me get that for you
http://packagist.org/
usage info




                        package info




versions
$ composer.phar search filter
$ composer.phar search filter



dms/dms-filter-bundle             :   DMS Filter Bundle, makes Annotation based ...
lexik/form-filter-bundle          :   This bundle aim to provide classes to build...
rollerworks/recordfilter-bundle   :   Record search-filtering bundle for Symfony
brikou/zend_filter                :   Zend Framework Filter Library
ext-filter                        :   The filter PHP extension
dms/dms-filter                    :   DMS Library, includes various bundles and ...
shtumi/useful-bundle              :   Symfony ShtumiUsefulBundle
$ composer.phar show dms/dms-filter-bundle
$ composer.phar show dms/dms-filter-bundle



name     :   dms/dms-filter-bundle
descrip. :   DMS Filter Bundle, makes Annotation based entity filtering available
in Symfony
keywords :   symfony, bundle, filter, dms
versions :   dev-master, v1.1.1, v1.1, 1.0.2, 1.0.1, 1.0.0
type     :   symfony-bundle
license :    MIT
source   :   [git] https://github.com/rdohms/DMSFilterBundle v1.1.1
dist     :   [zip] https://github.com/rdohms/DMSFilterBundle/zipball/v1.1.1 v1.1.1
names    :   dms/dms-filter-bundle

autoload
psr-0
DMSBundleFilterBundle => .

requires
php >=5.3.2
dms/dms-filter >=1.0.2
B2( ", r$p#)(!r, )0 pr)v'($!
  Get your own package repository
S'()0!
R!&&!2( ,!2r !w. S'()0
$ composer.phar create-project composer/satis
R!&&!2( ,!2r !w. S'()0
$ composer.phar create-project composer/satis
$ vi packages.json


  {
      "name": "My Repository",
      "homepage": "http://packages.example.org",
      "repositories": [
          { "type": "vcs", "url": "http://github.com/mycompany/privaterepo" },
          { "type": "vcs", "url": "http://svn.example.org/private/repo" },
          { "type": "vcs", "url": "http://github.com/mycompany/privaterepo2" }
      ],
      "require-all": true
  }
R!&&!2( ,!2r !w. S'()0
$ composer.phar create-project composer/satis
$ vi packages.json


  {
      "name": "My Repository",
      "homepage": "http://packages.example.org",
      "repositories": [
          { "type": "vcs", "url": "http://github.com/mycompany/privaterepo" },
          { "type": "vcs", "url": "http://svn.example.org/private/repo" },
          { "type": "vcs", "url": "http://github.com/mycompany/privaterepo2" }
      ],
      "require-all": true
  }



$ php bin/satis build config.json web/
U0)./ ,!2r !w. S'()0
{
    "repositories": [
        {
            "type": "composer",
            "url": "http://packages.yourdomain.net"
        }
    ],

    “require”: {
        “myvendor/mypackage”: “dev-master”
    }
}
U0)./ ,!2r !w. S'()0
{
    "repositories": [     “composer”: use this just like it was Packagist
        {
            "type": "composer",
            "url": "http://packages.yourdomain.net"
        }
    ],

    “require”: {
        “myvendor/mypackage”: “dev-master”
    }
}
W+$r$ 0+!2&- I /$( +$&p?

    http://getcomposer.org

 #composer on irc.freenode.org
%$ E&$v'(!r P)(*+
     Dependency Manager, consistent versions, per-project




               Ev$r,-', *!"p#)./
               install, update, lock and autoload




           Up/r'-)./ (! ' M'$0(r!
post-install, overriding, PEAR integration, developer environment




                 1.-)./ ,!2r (2.$
                       Satis and Packagist
Q2$0()!.0?

@rdohms

http://doh.ms

http://slides.doh.ms

More Related Content

PDF
Composer, putting dependencies on the score
PDF
Composer for busy developers - DPC13
PDF
はじめてのSymfony2
PDF
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
PPT
Composer - Package Management for PHP. Silver Bullet?
PPT
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
PDF
DevOps in PHP environment
PPTX
Infrastructure as code - Python Saati #36
Composer, putting dependencies on the score
Composer for busy developers - DPC13
はじめてのSymfony2
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
Composer - Package Management for PHP. Silver Bullet?
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
DevOps in PHP environment
Infrastructure as code - Python Saati #36

What's hot (20)

KEY
Composer
PPTX
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
PDF
Composer the right way - SunshinePHP
PDF
Dependency management with Composer
PDF
Composer for Busy Developers - php|tek13
PPTX
PHP & JavaScript & CSS Coding style
PDF
PHPCon China 2018 - 好孩子的 PHP 撰碼指南
PDF
PECL Picks - Extensions to make your life better
KEY
Crafting Beautiful CLI Applications in Ruby
PDF
Dependencies Managers in C/C++. Using stdcpp 2014
PDF
Continuous Quality Assurance
KEY
Introducing Command Line Applications with Ruby
PDF
Deployment Tactics
ODP
Bootstrap your Cloud Infrastructure using puppet and hashicorp stack
ODP
Vagrant move over, here is Docker
PDF
Laravel 4 package development
PPTX
C++ for the Web
KEY
Railsconf2011 deployment tips_for_slideshare
PDF
OSDC 2014: Ole Michaelis & Sönke Rümpler: Make it SOLID - Software Architectu...
PDF
Zend\Expressive - höher, schneller, weiter
Composer
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
Composer the right way - SunshinePHP
Dependency management with Composer
Composer for Busy Developers - php|tek13
PHP & JavaScript & CSS Coding style
PHPCon China 2018 - 好孩子的 PHP 撰碼指南
PECL Picks - Extensions to make your life better
Crafting Beautiful CLI Applications in Ruby
Dependencies Managers in C/C++. Using stdcpp 2014
Continuous Quality Assurance
Introducing Command Line Applications with Ruby
Deployment Tactics
Bootstrap your Cloud Infrastructure using puppet and hashicorp stack
Vagrant move over, here is Docker
Laravel 4 package development
C++ for the Web
Railsconf2011 deployment tips_for_slideshare
OSDC 2014: Ole Michaelis & Sönke Rümpler: Make it SOLID - Software Architectu...
Zend\Expressive - höher, schneller, weiter
Ad

Similar to Composer: putting dependencies on the score (20)

PDF
May The Nodejs Be With You
PDF
The Modern Developer Toolbox
PPTX
Running Docker in Development & Production (DevSum 2015)
PPTX
Running Docker in Development & Production (#ndcoslo 2015)
PPTX
Toolbox of a Ruby Team
ODP
Subversionn Introduction at SuperMondays 2009-09-01
PDF
PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...
PDF
Challenges of container configuration
PPTX
Control your deployments with Capistrano
PPTX
Laravel Day / Deploy
PDF
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
PDF
PDF
Elixir on Containers
PDF
Continuous Delivery: The Next Frontier
PDF
Drone CI/CD 自動化測試及部署
PPTX
Docker Starter Pack
PPTX
Ruby on Rails and Docker - Why should I care?
PDF
How to create your own hack environment
PDF
Deploying Symfony | symfony.cat
PDF
Git::Hooks
May The Nodejs Be With You
The Modern Developer Toolbox
Running Docker in Development & Production (DevSum 2015)
Running Docker in Development & Production (#ndcoslo 2015)
Toolbox of a Ruby Team
Subversionn Introduction at SuperMondays 2009-09-01
PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...
Challenges of container configuration
Control your deployments with Capistrano
Laravel Day / Deploy
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
Elixir on Containers
Continuous Delivery: The Next Frontier
Drone CI/CD 自動化測試及部署
Docker Starter Pack
Ruby on Rails and Docker - Why should I care?
How to create your own hack environment
Deploying Symfony | symfony.cat
Git::Hooks
Ad

More from Rafael Dohms (20)

PDF
The Individual Contributor Path - DPC2024
PDF
Application Metrics - IPC2023
PDF
How'd we get here? A guide to Architectural Decision Records
PDF
Architectural Decision Records - PHPConfBR
PDF
Application Metrics (with Prometheus examples)
PDF
Application metrics - Confoo 2019
PDF
Writing code you won’t hate tomorrow - PHPCE18
PDF
Application Metrics (with Prometheus examples) #PHPDD18
PDF
Application metrics with Prometheus - DPC18
PDF
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
PDF
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
PDF
Composer The Right Way - 010PHP
PDF
Writing Code That Lasts - #Magento2Seminar, Utrecht
PDF
Composer the Right Way - PHPSRB16
PDF
“Writing code that lasts” … or writing code you won’t hate tomorrow. - #PHPSRB16
PDF
Composer the Right Way - MM16NL
PDF
Composer The Right Way - PHPUGMRN
PDF
Composer the Right Way - PHPBNL16
PDF
“Writing code that lasts” … or writing code you won’t hate tomorrow.
PDF
A Journey into your Lizard Brain - PHP Conference Brasil 2015
The Individual Contributor Path - DPC2024
Application Metrics - IPC2023
How'd we get here? A guide to Architectural Decision Records
Architectural Decision Records - PHPConfBR
Application Metrics (with Prometheus examples)
Application metrics - Confoo 2019
Writing code you won’t hate tomorrow - PHPCE18
Application Metrics (with Prometheus examples) #PHPDD18
Application metrics with Prometheus - DPC18
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
Composer The Right Way - 010PHP
Writing Code That Lasts - #Magento2Seminar, Utrecht
Composer the Right Way - PHPSRB16
“Writing code that lasts” … or writing code you won’t hate tomorrow. - #PHPSRB16
Composer the Right Way - MM16NL
Composer The Right Way - PHPUGMRN
Composer the Right Way - PHPBNL16
“Writing code that lasts” … or writing code you won’t hate tomorrow.
A Journey into your Lizard Brain - PHP Conference Brasil 2015

Recently uploaded (20)

PDF
cuic standard and advanced reporting.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Electronic commerce courselecture one. Pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
Cloud computing and distributed systems.
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
Big Data Technologies - Introduction.pptx
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
KodekX | Application Modernization Development
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Spectroscopy.pptx food analysis technology
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
cuic standard and advanced reporting.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Electronic commerce courselecture one. Pdf
Chapter 3 Spatial Domain Image Processing.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
Cloud computing and distributed systems.
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Network Security Unit 5.pdf for BCA BBA.
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Diabetes mellitus diagnosis method based random forest with bat algorithm
Big Data Technologies - Introduction.pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
KodekX | Application Modernization Development
MIND Revenue Release Quarter 2 2025 Press Release
Mobile App Security Testing_ A Comprehensive Guide.pdf
Spectroscopy.pptx food analysis technology
Encapsulation_ Review paper, used for researhc scholars
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx

Composer: putting dependencies on the score

  • 1. Rafael Dohms / @rdohms C!"p#$r Putting your dependencies on the score
  • 2. Rafael Dohms photo credit: Eli White @rdohms Evangelist, Speaker and Contributor. Developer at WEBclusive. Enabler at AmsterdamPHP.
  • 3. %$ E&$v'(!r P)(*+ a general introduction to Composer Ev$r,-', *!"p#)./ the basic stuff you need to know Up/r'-)./ (! ' M'$0(r! advanced features for more complex scenarios 1.-)./ ,!2r (2.$ discovering and sharing libraries
  • 5. per project system wide central repository spread out channels open acceptance strict standards
  • 6. Pr!b&$": I need my team and my deployments to use consistent versions of the dependencies of my project
  • 7. Pr!b&$": I need my team and my deployments to use consistent versions of the dependencies of my project S!&2()!.:
  • 8. Pr!b&$": I need my team and my deployments to use consistent versions of the dependencies of my project S!&2()!.: PEAR
  • 9. Pr!b&$": I need my team and my deployments to use consistent versions of the dependencies of my project S!&2()!.: PEAR SVN Externals
  • 10. Pr!b&$": I need my team and my deployments to use consistent versions of the dependencies of my project S!&2()!.: PEAR SVN Externals Git Submodules
  • 11. Pr!b&$": I need my team and my deployments to use consistent versions of the dependencies of my project S!&2()!.: PEAR SVN Externals Git Submodules vendor management script
  • 12. Pr!b&$": I need my team and my deployments to use consistent versions of the dependencies of my project S!&2()!.: PEAR SVN Externals Git Submodules vendor management script C!"p#$r!
  • 13. A per-project dependency manager that allows you to declare a consistent list of dependencies and versions for your application, as well as a consistent way of sharing your libraries and making them discoverable using packagist.org
  • 15. I.0('&&)./ C!"p#$r Local (embed) $ curl -s http://getcomposer.org/installer | php Global $ curl -s http://getcomposer.org/installer | php -- --install-dir=bin
  • 16. I.0('&&)./ C!"p#$r Local (embed) $ curl -s http://getcomposer.org/installer | php Global $ curl -s http://getcomposer.org/installer | php -- --install-dir=bin 3p: $ ln -s /usr/bin/composer.phar /usr/bin/composer
  • 18. I.0('&&)./ C!"p#$r $ composer.phar --version Composer version 6573fd3
  • 19. I.0('&&)./ C!"p#$r php $ composer.phar --version Composer version 6573fd3
  • 21. K$$p )( 2p-'($-! $ composer.phar self-update Updating to version 65e95ed. Downloading: 100%
  • 23. C!"p#$r 101 $ cd ~/dev/myproject
  • 24. C!"p#$r 101 $ cd ~/dev/myproject $ vim composer.json { "require": { "silex/silex": "1.0.*" }, "minimum-stability": "dev" }
  • 25. C!"p#$r 101 $ cd ~/dev/myproject $ vim composer.json note: project root { "require": { "silex/silex": "1.0.*" }, "minimum-stability": "dev" }
  • 26. C!"p#$r 101 $ cd ~/dev/myproject $ vim composer.json note: project root “require”: required packages and versions { "require": { adv. ex.: >=1.0.0,<1.2-dev "silex/silex": "1.0.*" }, "minimum-stability": "dev" }
  • 27. C!"p#$r 101 $ cd ~/dev/myproject $ vim composer.json note: project root “require”: required packages and versions { "require": { adv. ex.: >=1.0.0,<1.2-dev "silex/silex": "1.0.*" }, "minimum-stability": "dev" “minimum-stability”: if you only want stable } packages default: stable
  • 28. C!"p#$r 101 $ cd ~/dev/myproject $ vim composer.json note: project root “require”: required packages and versions { "require": { adv. ex.: >=1.0.0,<1.2-dev "silex/silex": "1.0.*" }, "minimum-stability": "dev" “minimum-stability”: if you only want stable } packages default: stable $ composer.phar install
  • 29. Installing dependencies - Installing pimple/pimple (dev-master) Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be - Installing symfony/routing (dev-master) Cloning 6bca82c3ea0d42d750de4f49b22020dfd047dc0f - Installing symfony/http-foundation (dev-master) Cloning 498c2da9c3fecefc7e3b0add73621f3feb337ddd - Installing symfony/event-dispatcher (dev-master) Cloning b99b49760016467099f010aff7a5098861d49e09 - Installing symfony/http-kernel (dev-master) Cloning 7f671472f009231f9c1f5ec9b81fc6fbfcd9a955 - Installing silex/silex (dev-master) Cloning 18e248a277adb061602d2bcabe96011db1c76ec0 symfony/routing suggests installing symfony/config (dev-master) symfony/routing suggests installing symfony/yaml (dev-master) symfony/routing suggests installing doctrine/common (>=2.2,<2.4-dev) symfony/event-dispatcher suggests installing symfony/dependency-injection (dev-master) symfony/http-kernel suggests installing symfony/browser-kit (dev-master) symfony/http-kernel suggests installing symfony/class-loader (dev-master) symfony/http-kernel suggests installing symfony/config (dev-master) symfony/http-kernel suggests installing symfony/console (dev-master) symfony/http-kernel suggests installing symfony/dependency-injection (dev-master) symfony/http-kernel suggests installing symfony/finder (dev-master) silex/silex suggests installing symfony/browser-kit (2.1.*) silex/silex suggests installing symfony/css-selector (2.1.*) silex/silex suggests installing symfony/dom-crawler (2.1.*) Writing lock file Generating autoload files
  • 30. Installing dependencies - Installing pimple/pimple (dev-master) Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be - Installing symfony/routing (dev-master) Cloning 6bca82c3ea0d42d750de4f49b22020dfd047dc0f - Installing symfony/http-foundation (dev-master) your dependency’s dependencies Cloning 498c2da9c3fecefc7e3b0add73621f3feb337ddd - Installing symfony/event-dispatcher (dev-master) Cloning b99b49760016467099f010aff7a5098861d49e09 - Installing symfony/http-kernel (dev-master) Cloning 7f671472f009231f9c1f5ec9b81fc6fbfcd9a955 - Installing silex/silex (dev-master) Cloning 18e248a277adb061602d2bcabe96011db1c76ec0 symfony/routing suggests installing symfony/config (dev-master) symfony/routing suggests installing symfony/yaml (dev-master) symfony/routing suggests installing doctrine/common (>=2.2,<2.4-dev) symfony/event-dispatcher suggests installing symfony/dependency-injection (dev-master) symfony/http-kernel suggests installing symfony/browser-kit (dev-master) symfony/http-kernel suggests installing symfony/class-loader (dev-master) symfony/http-kernel suggests installing symfony/config (dev-master) symfony/http-kernel suggests installing symfony/console (dev-master) symfony/http-kernel suggests installing symfony/dependency-injection (dev-master) symfony/http-kernel suggests installing symfony/finder (dev-master) silex/silex suggests installing symfony/browser-kit (2.1.*) silex/silex suggests installing symfony/css-selector (2.1.*) silex/silex suggests installing symfony/dom-crawler (2.1.*) Writing lock file Generating autoload files
  • 31. Installing dependencies - Installing pimple/pimple (dev-master) Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be - Installing symfony/routing (dev-master) Cloning 6bca82c3ea0d42d750de4f49b22020dfd047dc0f - Installing symfony/http-foundation (dev-master) your dependency’s dependencies Cloning 498c2da9c3fecefc7e3b0add73621f3feb337ddd - Installing symfony/event-dispatcher (dev-master) Cloning b99b49760016467099f010aff7a5098861d49e09 - Installing symfony/http-kernel (dev-master) Cloning 7f671472f009231f9c1f5ec9b81fc6fbfcd9a955 - Installing silex/silex (dev-master) Cloning 18e248a277adb061602d2bcabe96011db1c76ec0 your dependency symfony/routing suggests installing symfony/config (dev-master) symfony/routing suggests installing symfony/yaml (dev-master) symfony/routing suggests installing doctrine/common (>=2.2,<2.4-dev) symfony/event-dispatcher suggests installing symfony/dependency-injection (dev-master) symfony/http-kernel suggests installing symfony/browser-kit (dev-master) symfony/http-kernel suggests installing symfony/class-loader (dev-master) symfony/http-kernel suggests installing symfony/config (dev-master) symfony/http-kernel suggests installing symfony/console (dev-master) symfony/http-kernel suggests installing symfony/dependency-injection (dev-master) symfony/http-kernel suggests installing symfony/finder (dev-master) silex/silex suggests installing symfony/browser-kit (2.1.*) silex/silex suggests installing symfony/css-selector (2.1.*) silex/silex suggests installing symfony/dom-crawler (2.1.*) Writing lock file Generating autoload files
  • 32. Installing dependencies - Installing pimple/pimple (dev-master) Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be - Installing symfony/routing (dev-master) Cloning 6bca82c3ea0d42d750de4f49b22020dfd047dc0f - Installing symfony/http-foundation (dev-master) your dependency’s dependencies Cloning 498c2da9c3fecefc7e3b0add73621f3feb337ddd - Installing symfony/event-dispatcher (dev-master) Cloning b99b49760016467099f010aff7a5098861d49e09 - Installing symfony/http-kernel (dev-master) Cloning 7f671472f009231f9c1f5ec9b81fc6fbfcd9a955 - Installing silex/silex (dev-master) Cloning 18e248a277adb061602d2bcabe96011db1c76ec0 your dependency symfony/routing suggests installing symfony/config (dev-master) symfony/routing suggests installing symfony/yaml (dev-master) symfony/routing suggests installing doctrine/common (>=2.2,<2.4-dev) symfony/event-dispatcher suggests installing symfony/dependency-injection (dev-master) symfony/http-kernel suggests installing symfony/browser-kit (dev-master) symfony/http-kernel suggests installing symfony/class-loader (dev-master) symfony/http-kernel suggests installing symfony/config (dev-master) symfony/http-kernel suggests installing symfony/console (dev-master) symfony/http-kernel suggests installing symfony/dependency-injection (dev-master) symfony/http-kernel suggests installing symfony/finder (dev-master) silex/silex suggests installing symfony/browser-kit (2.1.*) silex/silex suggests installing symfony/css-selector (2.1.*) silex/silex suggests installing symfony/dom-crawler (2.1.*) suggestions of other packages, Writing lock file Generating autoload files for further features
  • 33. P)*42p (+$ ($"p!! Let Composer bootstrap you development
  • 34. B!!(0(r'pp)./ Pr!5$*(0 $ composer.phar create-project fabpot/silex-skeleton ~/dev/myproject
  • 35. B!!(0(r'pp)./ Pr!5$*(0 $ composer.phar create-project fabpot/silex-skeleton ~/dev/myproject Installing fabpot/silex-skeleton (dev-master cc19d406cf3cac253715db92d400992d4f3e1b52) - Installing fabpot/silex-skeleton (dev-master) Cloning master Created project in one-liner/ Installing dependencies - Installing pimple/pimple (dev-master) Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be [...] symfony/routing suggests installing symfony/yaml (dev-master) [...] Writing lock file Generating autoload files
  • 36. B!!(0(r'pp)./ Pr!5$*(0 $ composer.phar create-project fabpot/silex-skeleton ~/dev/myproject Installing fabpot/silex-skeleton (dev-master cc19d406cf3cac253715db92d400992d4f3e1b52) - Installing fabpot/silex-skeleton (dev-master) Cloning master Created project in one-liner/ myproje ct/ Installing dependencies compose - Installing pimple/pimple (dev-master) r.json compose Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be r.lock config/ [...] console / src/ symfony/routing suggests installing symfony/yaml (dev-master) templat [...] es/ vendor/ Writing lock file web/ Generating autoload files
  • 37. I w'.( (! *!.(r)b2($ ' pr!5$*( Composer can set that up for you.
  • 38. B!!(0(r'pp)./ C!.(r)b2()!.0 $ composer.phar create-project dms/dms --dev ~/dev/oss/dms
  • 39. B!!(0(r'pp)./ C!.(r)b2()!.0 gimme dev packages $ composer.phar create-project dms/dms --dev ~/dev/oss/dms
  • 40. B!!(0(r'pp)./ C!.(r)b2()!.0 gimme dev packages $ composer.phar create-project dms/dms --dev ~/dev/oss/dms     "require-dev": {         "symfony/symfony": ">=2.1-dev",         "doctrine/orm": "dev-master"     },
  • 41. B!!(0(r'pp)./ C!.(r)b2()!.0 gimme dev packages $ composer.phar create-project dms/dms --dev ~/dev/oss/dms     "require-dev": {         "symfony/symfony": ">=2.1-dev",         "doctrine/orm": "dev-master"     }, “require-dev”: only needed if you are going to contribute
  • 42. H!w -! I 6.-/&!'- (+$ 6&$0? PSR-0 and the modern autoloader
  • 43. Composer generates an autoload file for all your dependencies
  • 44. Composer generates an autoload file for all your dependencies vendor/autoload.php
  • 45. "autoload": {     "psr-0": { "MyNamespace": "<root>" }, "classmap": ["src/", "lib/", "Something.php"], "files": ["src/MyLibrary/functions.php"] },
  • 46. “autoload”: describes the autoloading needed for your library "autoload": {     "psr-0": { "MyNamespace": "<root>" }, "classmap": ["src/", "lib/", "Something.php"], "files": ["src/MyLibrary/functions.php"] },
  • 47. “autoload”: describes the autoloading needed for your library "autoload": {     "psr-0": { "MyNamespace": "<root>" }, “psr-0”: PSR-0 Compatible libraries "classmap": ["src/", "lib/", "Something.php"], "files": ["src/MyLibrary/functions.php"] },
  • 48. “autoload”: describes the autoloading needed for your library "autoload": {     "psr-0": { "MyNamespace": "<root>" }, “psr-0”: PSR-0 Compatible libraries “classmap”: Old PEAR packages and other "classmap": ["src/", "lib/", "Something.php"], libraries "files": ["src/MyLibrary/functions.php"] },
  • 49. “autoload”: describes the autoloading needed for your library "autoload": {     "psr-0": { "MyNamespace": "<root>" }, “psr-0”: PSR-0 Compatible libraries “classmap”: Old PEAR packages and other "classmap": ["src/", "lib/", "Something.php"], libraries "files": ["src/MyLibrary/functions.php"] “files”: for php functions or initializations },
  • 50. I.0('&&)./, 2p-'()./ '.- "!v)./ !. how does Composer guarantee consistency
  • 53. “composer.json”: metadata and list of your dependencies. composer.json
  • 54. “composer.json”: metadata and list of your dependencies. composer.json composer.lock
  • 55. “composer.json”: metadata and list of your dependencies. composer.json composer.lock “composer.lock”: existing dependencies and current commit hashes.
  • 57. update composer.json composer.lock
  • 58. update install composer.json composer.lock
  • 59. update install reads composer.json composer.lock
  • 60. update install reads composer.json composer.lock gets latest
  • 61. update install reads composer.json writes composer.lock gets latest
  • 62. update install reads reads composer.json writes composer.lock gets latest
  • 63. update install reads reads composer.json compares writes composer.lock gets latest
  • 64. update install reads reads composer.json compares writes composer.lock gets latest gets locked version
  • 65. D$v$&!p)./ '. App ). ' ($'"? Commit you composer.lock file into the repository, and use composer install.
  • 66. D$v$&!p)./ '. App ). ' ($'"? Commit you composer.lock file into the repository, and use composer install. will ensure everyone is on the same “page”
  • 67. I’" -$v$&!p)./ ' &)br'r,, +$&p! here are some fields you should care about
  • 68. { "name": "vendor-namespace/package-name", "type": "symfony-bundle", "description": "A sample package for examples", "keywords": ["php", "package"], "homepage": "http://doh.ms", "license": "MIT", "support": { "email": "support@mylib.com", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install", }
  • 69. “name”: this should be unique, pick a good one! { "name": "vendor-namespace/package-name", "type": "symfony-bundle", "description": "A sample package for examples", "keywords": ["php", "package"], "homepage": "http://doh.ms", "license": "MIT", "support": { "email": "support@mylib.com", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install", }
  • 70. “name”: this should be unique, pick a good one! { "name": "vendor-namespace/package-name", “type”: will be used for more advanced "type": "symfony-bundle", “custom”installs "description": "A sample package for examples", "keywords": ["php", "package"], "homepage": "http://doh.ms", "license": "MIT", "support": { "email": "support@mylib.com", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install", }
  • 71. “name”: this should be unique, pick a good one! { "name": "vendor-namespace/package-name", “type”: will be used for more advanced "type": "symfony-bundle", “custom”installs "description": "A sample package for examples", "keywords": ["php", "package"], "homepage": "http://doh.ms", "license": "MIT", “license”: very important! "support": { "email": "support@mylib.com", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install", }
  • 72. “name”: this should be unique, pick a good one! { "name": "vendor-namespace/package-name", “type”: will be used for more advanced "type": "symfony-bundle", “custom”installs "description": "A sample package for examples", "keywords": ["php", "package"], "homepage": "http://doh.ms", "license": "MIT", “license”: very important! "support": { "email": "support@mylib.com", “support”: point people the right way. "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install", }
  • 73. “name”: this should be unique, pick a good one! { "name": "vendor-namespace/package-name", “type”: will be used for more advanced "type": "symfony-bundle", “custom”installs "description": "A sample package for examples", "keywords": ["php", "package"], "homepage": "http://doh.ms", "license": "MIT", “license”: very important! "support": { "email": "support@mylib.com", “support”: point people the right way. "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install", } “target-dir”: great for installing sub-dir splits repositories ex: Symfony Bundles: /Acme/Bundle/MyBundle
  • 74. M, *!-$ )0 PHP 5.4 !.&,! managing system dependencies
  • 75. { "require": { "php": ">=5.3.3", "ext-ldap": "*" } }
  • 76. { “php”: PHP version. "require": { "php": ">=5.3.3", "ext-ldap": "*" } }
  • 77. { “php”: PHP version. "require": { "php": ">=5.3.3", "ext-ldap": "*" } } “ext-*”: Presence of selected extension
  • 78. Up/r'-)./ (! ' M'$0(r!
  • 79. B2( I .$$- ' 0p$*)6* v$r0)!. version modifiers to the rescue!
  • 82. “#<ref>”: Get this specific commit "acme/foo": "1.0.x-dev#3ebbe75"
  • 83. “#<ref>”: Get this specific commit "acme/foo": "1.0.x-dev#3ebbe75" "acme/foo": "@dev" "acme/foo": "1.0.*@beta"
  • 84. “#<ref>”: Get this specific commit "acme/foo": "1.0.x-dev#3ebbe75" "acme/foo": "@dev" "acme/foo": "1.0.*@beta" “@<state>”: Get a version outside your default stability
  • 85. I .$$- (! 7$*2($ ' f$w 0*r)p(0 how to automate tasks with Composer
  • 86.     "scripts": {         "post-install-cmd": [             "SensioBundleDistributionBundleComposerScriptHandler::buildBootstrap",             "SensioBundleDistributionBundleComposerScriptHandler::clearCache",             "SensioBundleDistributionBundleComposerScriptHandler::installAssets",             "SensioBundleDistributionBundleComposerScriptHandler::installRequirementsFile"         ],         "post-update-cmd": [             "SensioBundleDistributionBundleComposerScriptHandler::buildBootstrap",             "SensioBundleDistributionBundleComposerScriptHandler::clearCache",             "SensioBundleDistributionBundleComposerScriptHandler::installAssets",             "SensioBundleDistributionBundleComposerScriptHandler::installRequirementsFile"         ]     },
  • 87. “scripts”: allows you to run scripts at given moments     "scripts": {         "post-install-cmd": [             "SensioBundleDistributionBundleComposerScriptHandler::buildBootstrap",             "SensioBundleDistributionBundleComposerScriptHandler::clearCache",             "SensioBundleDistributionBundleComposerScriptHandler::installAssets",             "SensioBundleDistributionBundleComposerScriptHandler::installRequirementsFile"         ],         "post-update-cmd": [             "SensioBundleDistributionBundleComposerScriptHandler::buildBootstrap",             "SensioBundleDistributionBundleComposerScriptHandler::clearCache",             "SensioBundleDistributionBundleComposerScriptHandler::installAssets",             "SensioBundleDistributionBundleComposerScriptHandler::installRequirementsFile"         ]     },
  • 88. C20(!" R$p#)(!r)$0 !r .! C!"p#$r, w+'( .!w? Injecting Composer into wild packages
  • 93. “hero/superpackage”: “dev-master”     "repositories": [ { "type": "vcs", "url": "https://github.com/rdohms/hero-superpackage" }        ]
  • 94. “hero/superpackage”: “dev-master” “repositories”: point to non-indexed, override existing or on- the-fly packages     "repositories": [ { "type": "vcs", "url": "https://github.com/rdohms/hero-superpackage" }        ]
  • 95. N!.-C!"p#$r P'*4'/$ { "repositories": [ { "type": "package", "package": { "name": "smarty/smarty", "version": "3.1.7", "dist": { "url": "http://www.smarty.net/files/Smarty-3.1.7.zip", "type": "zip" }, "source": { "url": "http://smarty-php.googlecode.com/svn/", "type": "svn", "reference": "tags/Smarty_3_1_7/distribution/" } } } ] }
  • 96. N!.-C!"p#$r P'*4'/$ { "repositories": “package”: on-the-fly package, injecting a composer.json [ { "type": "package", "package": { "name": "smarty/smarty", "version": "3.1.7", "dist": { "url": "http://www.smarty.net/files/Smarty-3.1.7.zip", "type": "zip" }, "source": { "url": "http://smarty-php.googlecode.com/svn/", "type": "svn", "reference": "tags/Smarty_3_1_7/distribution/" } } } ] }
  • 97. N!.-C!"p#$r P'*4'/$ { "repositories": “package”: on-the-fly package, injecting a composer.json [ { "type": "package", "package": { "name": "smarty/smarty", "version": "3.1.7", "dist": { "url": "http://www.smarty.net/files/Smarty-3.1.7.zip", "type": "zip" SVN / Git }, "source": { "url": "http://smarty-php.googlecode.com/svn/", "type": "svn", "reference": "tags/Smarty_3_1_7/distribution/" } } } ] }
  • 98. I .$$- (+)0 PEAR p'*4'/$... No Problem!
  • 99. { "repositories": [ { "type": "pear", "url": "http://pear2.php.net" } ], "require": { "pear-pear2.php.net/PEAR2_Text_Markdown": "*", "pear-pear2/PEAR2_HTTP_Request": "*" } }
  • 100. { "repositories": [ “pear”: official PEAR and custom PEAR channels { "type": "pear", "url": "http://pear2.php.net" } ], "require": { "pear-pear2.php.net/PEAR2_Text_Markdown": "*", "pear-pear2/PEAR2_HTTP_Request": "*" } }
  • 101. { "repositories": [ “pear”: official PEAR and custom PEAR channels { "type": "pear", "url": "http://pear2.php.net" } ], "require": { "pear-pear2.php.net/PEAR2_Text_Markdown": "*", "pear-pear2/PEAR2_HTTP_Request": "*" } } Remember the prefix!
  • 102. { "repositories": [ “pear”: official PEAR and custom PEAR channels { "type": "pear", "url": "http://pear2.php.net" } ], "require": { "pear-pear2.php.net/PEAR2_Text_Markdown": "*", "pear-pear2/PEAR2_HTTP_Request": "*" } } Remember the prefix! !! Warning: PEAR causes a overhead of requests
  • 103. alias replace provide
  • 104. alias { "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "require": { "monolog/monolog": "dev-bugfix as 1.0.x-dev" } } replace provide
  • 105. alias { "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "require": { "monolog/monolog": "dev-bugfix as 1.0.x-dev" } } replace provide “replace”: allows you to replace other packages, and be used them in their place.
  • 106. alias { "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "require": { "monolog/monolog": "dev-bugfix as 1.0.x-dev" } } replace provide “replace”: allows you to “provide”: allows you to say replace other packages, and a package provides a be used them in their place. expectation.
  • 108. I .$$- ' &)br'r, (+'( -!$0.. Let me get that for you
  • 110. usage info package info versions
  • 112. $ composer.phar search filter dms/dms-filter-bundle : DMS Filter Bundle, makes Annotation based ... lexik/form-filter-bundle : This bundle aim to provide classes to build... rollerworks/recordfilter-bundle : Record search-filtering bundle for Symfony brikou/zend_filter : Zend Framework Filter Library ext-filter : The filter PHP extension dms/dms-filter : DMS Library, includes various bundles and ... shtumi/useful-bundle : Symfony ShtumiUsefulBundle
  • 113. $ composer.phar show dms/dms-filter-bundle
  • 114. $ composer.phar show dms/dms-filter-bundle name : dms/dms-filter-bundle descrip. : DMS Filter Bundle, makes Annotation based entity filtering available in Symfony keywords : symfony, bundle, filter, dms versions : dev-master, v1.1.1, v1.1, 1.0.2, 1.0.1, 1.0.0 type : symfony-bundle license : MIT source : [git] https://github.com/rdohms/DMSFilterBundle v1.1.1 dist : [zip] https://github.com/rdohms/DMSFilterBundle/zipball/v1.1.1 v1.1.1 names : dms/dms-filter-bundle autoload psr-0 DMSBundleFilterBundle => . requires php >=5.3.2 dms/dms-filter >=1.0.2
  • 115. B2( ", r$p#)(!r, )0 pr)v'($! Get your own package repository
  • 116. S'()0!
  • 117. R!&&!2( ,!2r !w. S'()0 $ composer.phar create-project composer/satis
  • 118. R!&&!2( ,!2r !w. S'()0 $ composer.phar create-project composer/satis $ vi packages.json { "name": "My Repository", "homepage": "http://packages.example.org", "repositories": [ { "type": "vcs", "url": "http://github.com/mycompany/privaterepo" }, { "type": "vcs", "url": "http://svn.example.org/private/repo" }, { "type": "vcs", "url": "http://github.com/mycompany/privaterepo2" } ], "require-all": true }
  • 119. R!&&!2( ,!2r !w. S'()0 $ composer.phar create-project composer/satis $ vi packages.json { "name": "My Repository", "homepage": "http://packages.example.org", "repositories": [ { "type": "vcs", "url": "http://github.com/mycompany/privaterepo" }, { "type": "vcs", "url": "http://svn.example.org/private/repo" }, { "type": "vcs", "url": "http://github.com/mycompany/privaterepo2" } ], "require-all": true } $ php bin/satis build config.json web/
  • 120. U0)./ ,!2r !w. S'()0 { "repositories": [ { "type": "composer", "url": "http://packages.yourdomain.net" } ], “require”: { “myvendor/mypackage”: “dev-master” } }
  • 121. U0)./ ,!2r !w. S'()0 { "repositories": [ “composer”: use this just like it was Packagist { "type": "composer", "url": "http://packages.yourdomain.net" } ], “require”: { “myvendor/mypackage”: “dev-master” } }
  • 122. W+$r$ 0+!2&- I /$( +$&p? http://getcomposer.org #composer on irc.freenode.org
  • 123. %$ E&$v'(!r P)(*+ Dependency Manager, consistent versions, per-project Ev$r,-', *!"p#)./ install, update, lock and autoload Up/r'-)./ (! ' M'$0(r! post-install, overriding, PEAR integration, developer environment 1.-)./ ,!2r (2.$ Satis and Packagist