composer: putting dependencies on the score

124
C!"p#$r Putting your dependencies on the score Rafael Dohms / @rdohms

Upload: rafael-dohms

Post on 10-May-2015

6.815 views

Category:

Technology


3 download

DESCRIPTION

As PHP projects grow and mature so does their list of dependencies and third party code. Managing all these external packages during development and especially deploy is not an easy task and can be very error prone. Enter Composer, a tool that allows you to keep a consistent list of dependencies and versions across your whole team and all your environments, managing and making discovery of new libraries a breeze. Let's see how Composer can solve all your problems with a simple command line interface and a json configuration file.

TRANSCRIPT

Page 1: Composer: putting dependencies on the score

C!"p#$rPutting your dependencies on the score

Rafael Dohms / @rdohms

Page 2: Composer: putting dependencies on the score

phot

o cr

edit:

Eli W

hite

Evangelist, Speaker and Contributor.

Developer at WEBclusive.

Enabler at AmsterdamPHP.

Rafael Dohms@rdohms

Page 3: Composer: putting dependencies on the score

%$ 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

Page 4: Composer: putting dependencies on the score

%$ E&$v'(!r P)(*+

Page 5: Composer: putting dependencies on the score

per project system wide

central repository

open acceptance

spread out channels

strict standards

Page 6: Composer: putting dependencies on the score

Pr!b&$":

I need my team and my deployments to use consistent versions of the dependencies of my project

Page 7: Composer: putting dependencies on the score

Pr!b&$":

I need my team and my deployments to use consistent versions of the dependencies of my project

S!&2()!.:

Page 8: Composer: putting dependencies on the score

Pr!b&$":

I need my team and my deployments to use consistent versions of the dependencies of my project

S!&2()!.:PEAR

Page 9: Composer: putting dependencies on the score

Pr!b&$":

I need my team and my deployments to use consistent versions of the dependencies of my project

S!&2()!.:PEAR

SVN Externals

Page 10: Composer: putting dependencies on the score

Pr!b&$":

I need my team and my deployments to use consistent versions of the dependencies of my project

S!&2()!.:PEAR

SVN ExternalsGit Submodules

Page 11: Composer: putting dependencies on the score

Pr!b&$":

I need my team and my deployments to use consistent versions of the dependencies of my project

S!&2()!.:PEAR

SVN ExternalsGit Submodules

vendor management script

Page 12: Composer: putting dependencies on the score

Pr!b&$":

I need my team and my deployments to use consistent versions of the dependencies of my project

S!&2()!.:PEAR

SVN ExternalsGit Submodules

vendor management script

C!"p#$r!

Page 13: Composer: putting dependencies on the score

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

Page 14: Composer: putting dependencies on the score

Ev$r,-', C!"p#)./

Page 15: Composer: putting dependencies on the score

I.0('&&)./ C!"p#$r

$ curl -s http://getcomposer.org/installer | php

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

Local (embed)

Global

Page 16: Composer: putting dependencies on the score

I.0('&&)./ C!"p#$r

$ curl -s http://getcomposer.org/installer | php

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

Local (embed)

Global

$ ln -s /usr/bin/composer.phar /usr/bin/composer3p:

Page 17: Composer: putting dependencies on the score

I.0('&&)./ C!"p#$r

Page 18: Composer: putting dependencies on the score

I.0('&&)./ C!"p#$r

$ composer.phar --version

Composer version 6573fd3

Page 19: Composer: putting dependencies on the score

I.0('&&)./ C!"p#$r

$ composer.phar --version

Composer version 6573fd3

php

Page 20: Composer: putting dependencies on the score

K$$p )( 2p-'($-!

Page 21: Composer: putting dependencies on the score

K$$p )( 2p-'($-!

$ composer.phar self-update

Updating to version 65e95ed. Downloading: 100%

Page 22: Composer: putting dependencies on the score

C!"p#$r 101

Page 23: Composer: putting dependencies on the score

C!"p#$r 101

$ cd ~/dev/myproject

Page 24: Composer: putting dependencies on the score

C!"p#$r 101

$ cd ~/dev/myproject

$ vim composer.json

{ "require": { "silex/silex": "1.0.*" }, "minimum-stability": "dev"}

Page 25: Composer: putting dependencies on the score

C!"p#$r 101

$ cd ~/dev/myproject

$ vim composer.json

{ "require": { "silex/silex": "1.0.*" }, "minimum-stability": "dev"}

note: project root

Page 26: Composer: putting dependencies on the score

C!"p#$r 101

$ cd ~/dev/myproject

$ vim composer.json

{ "require": { "silex/silex": "1.0.*" }, "minimum-stability": "dev"}

note: project root

“require”: required packages and versions

adv. ex.: >=1.0.0,<1.2-dev

Page 27: Composer: putting dependencies on the score

C!"p#$r 101

$ cd ~/dev/myproject

$ vim composer.json

{ "require": { "silex/silex": "1.0.*" }, "minimum-stability": "dev"}

note: project root

“require”: required packages and versions

adv. ex.: >=1.0.0,<1.2-dev

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

default: stable

Page 28: Composer: putting dependencies on the score

C!"p#$r 101

$ cd ~/dev/myproject

$ vim composer.json

$ composer.phar install

{ "require": { "silex/silex": "1.0.*" }, "minimum-stability": "dev"}

note: project root

“require”: required packages and versions

adv. ex.: >=1.0.0,<1.2-dev

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

default: stable

Page 29: Composer: putting dependencies on the score

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 fileGenerating autoload files

Page 30: Composer: putting dependencies on the score

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 fileGenerating autoload files

your dependency’s dependencies

Page 31: Composer: putting dependencies on the score

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 fileGenerating autoload files

your dependency

your dependency’s dependencies

Page 32: Composer: putting dependencies on the score

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 fileGenerating autoload files

your dependency

your dependency’s dependencies

suggestions of other packages, for further features

Page 33: Composer: putting dependencies on the score

P)*42p (+$ ($"p!!Let Composer bootstrap you development

Page 34: Composer: putting dependencies on the score

B!!(0(r'pp)./ Pr!5$*(0

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

Page 35: Composer: putting dependencies on the score

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 fileGenerating autoload files

Page 36: Composer: putting dependencies on the score

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 fileGenerating autoload files

myproject/composer.jsoncomposer.lockconfig/console/src/templates/vendor/web/

Page 37: Composer: putting dependencies on the score

I w'.( (! *!.(r)b2($ ' pr!5$*(Composer can set that up for you.

Page 38: Composer: putting dependencies on the score

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

B!!(0(r'pp)./ C!.(r)b2()!.0

Page 39: Composer: putting dependencies on the score

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

B!!(0(r'pp)./ C!.(r)b2()!.0

gimme dev packages

Page 40: Composer: putting dependencies on the score

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

B!!(0(r'pp)./ C!.(r)b2()!.0

gimme dev packages

    "require-dev": {        "symfony/symfony": ">=2.1-dev",        "doctrine/orm": "dev-master"    },

Page 41: Composer: putting dependencies on the score

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

B!!(0(r'pp)./ C!.(r)b2()!.0

gimme dev packages

    "require-dev": {        "symfony/symfony": ">=2.1-dev",        "doctrine/orm": "dev-master"    },

“require-dev”: only needed if you are going to contribute

Page 42: Composer: putting dependencies on the score

H!w -! I 6.-/&!'- (+$ 6&$0?PSR-0 and the modern autoloader

Page 43: Composer: putting dependencies on the score

Composer generates an autoload file for all your

dependencies

Page 44: Composer: putting dependencies on the score

Composer generates an autoload file for all your

dependencies

vendor/autoload.php

Page 45: Composer: putting dependencies on the score

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

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

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

},

Page 46: Composer: putting dependencies on the score

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

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

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

},

“autoload”: describes the autoloading needed for your library

Page 47: Composer: putting dependencies on the score

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

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

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

},

“autoload”: describes the autoloading needed for your library

“psr-0”: PSR-0 Compatible libraries

Page 48: Composer: putting dependencies on the score

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

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

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

},

“autoload”: describes the autoloading needed for your library

“classmap”: Old PEAR packages and other libraries

“psr-0”: PSR-0 Compatible libraries

Page 49: Composer: putting dependencies on the score

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

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

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

},

“autoload”: describes the autoloading needed for your library

“classmap”: Old PEAR packages and other libraries

“files”: for php functions or initializations

“psr-0”: PSR-0 Compatible libraries

Page 50: Composer: putting dependencies on the score

I.0('&&)./, 2p-'()./ '.- "!v)./ !.how does Composer guarantee consistency

Page 51: Composer: putting dependencies on the score
Page 52: Composer: putting dependencies on the score

composer.json

Page 53: Composer: putting dependencies on the score

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

composer.json

Page 54: Composer: putting dependencies on the score

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

composer.lock

composer.json

Page 55: Composer: putting dependencies on the score

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

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

composer.lock

composer.json

Page 56: Composer: putting dependencies on the score

composer.lock

composer.json

Page 57: Composer: putting dependencies on the score

update

composer.lock

composer.json

Page 58: Composer: putting dependencies on the score

update install

composer.lock

composer.json

Page 59: Composer: putting dependencies on the score

update install

reads

composer.lock

composer.json

Page 60: Composer: putting dependencies on the score

update install

reads

gets latest

composer.lock

composer.json

Page 61: Composer: putting dependencies on the score

update install

reads

gets latest

writescomposer.lock

composer.json

Page 62: Composer: putting dependencies on the score

update install

reads

gets latest

writes

reads

composer.lock

composer.json

Page 63: Composer: putting dependencies on the score

update install

reads

gets latest

writes

reads

compares

composer.lock

composer.json

Page 64: Composer: putting dependencies on the score

update install

reads

gets latest

writes

reads

gets locked version

compares

composer.lock

composer.json

Page 65: Composer: putting dependencies on the score

D$v$&!p)./ '. App ). ' ($'"?

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

composer install.

Page 66: Composer: putting dependencies on the score

D$v$&!p)./ '. App ). ' ($'"?

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

composer install.

will ensure everyone is on the same “page”

Page 67: Composer: putting dependencies on the score

I’" -$v$&!p)./ ' &)br'r,, +$&p!here are some fields you should care about

Page 68: Composer: putting dependencies on the score

{ "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": "[email protected]", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install",}

Page 69: Composer: putting dependencies on the score

{ "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": "[email protected]", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install",}

“name”: this should be unique, pick a good one!

Page 70: Composer: putting dependencies on the score

{ "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": "[email protected]", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install",}

“name”: this should be unique, pick a good one!

“type”: will be used for more advanced “custom”installs

Page 71: Composer: putting dependencies on the score

{ "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": "[email protected]", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install",}

“name”: this should be unique, pick a good one!

“type”: will be used for more advanced “custom”installs

“license”: very important!

Page 72: Composer: putting dependencies on the score

{ "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": "[email protected]", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install",}

“name”: this should be unique, pick a good one!

“type”: will be used for more advanced “custom”installs

“license”: very important!

“support”: point people the right way.

Page 73: Composer: putting dependencies on the score

{ "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": "[email protected]", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install",}

“name”: this should be unique, pick a good one!

“type”: will be used for more advanced “custom”installs

“license”: very important!

“support”: point people the right way.

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

ex: Symfony Bundles: /Acme/Bundle/MyBundle

Page 74: Composer: putting dependencies on the score

M, *!-$ )0 PHP 5.4 !.&,!managing system dependencies

Page 75: Composer: putting dependencies on the score

{ "require": { "php": ">=5.3.3", "ext-ldap": "*" }}

Page 76: Composer: putting dependencies on the score

{ "require": { "php": ">=5.3.3", "ext-ldap": "*" }}

“php”: PHP version.

Page 77: Composer: putting dependencies on the score

{ "require": { "php": ">=5.3.3", "ext-ldap": "*" }}

“php”: PHP version.

“ext-*”: Presence of selected extension

Page 78: Composer: putting dependencies on the score

Up/r'-)./ (! ' M'$0(r!

Page 79: Composer: putting dependencies on the score

B2( I .$$- ' 0p$*)6* v$r0)!.version modifiers to the rescue!

Page 80: Composer: putting dependencies on the score
Page 83: Composer: putting dependencies on the score

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

"acme/foo": "@dev"

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

“#<ref>”: Get this specific commit

Page 84: Composer: putting dependencies on the score

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

"acme/foo": "@dev"

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

“#<ref>”: Get this specific commit

“@<state>”: Get a version outside your default stability

Page 85: Composer: putting dependencies on the score

I .$$- (! 7$*2($ ' f$w 0*r)p(0how to automate tasks with Composer

Page 86: Composer: putting dependencies on the score

    "scripts": {        "post-install-cmd": [            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"        ],        "post-update-cmd": [            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"        ]    },

Page 87: Composer: putting dependencies on the score

    "scripts": {        "post-install-cmd": [            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"        ],        "post-update-cmd": [            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"        ]    },

“scripts”: allows you to run scripts at given moments

Page 88: Composer: putting dependencies on the score

C20(!" R$p#)(!r)$0 !r .! C!"p#$r, w+'( .!w?

Injecting Composer into wild packages

Page 89: Composer: putting dependencies on the score

“hero/superpackage”: “dev-master”

Page 90: Composer: putting dependencies on the score

“hero/superpackage”: “dev-master”

Page 91: Composer: putting dependencies on the score

“hero/superpackage”: “dev-master”

Page 92: Composer: putting dependencies on the score

“hero/superpackage”: “dev-master”

Page 93: Composer: putting dependencies on the score

“hero/superpackage”: “dev-master”

    "repositories": [ { "type": "vcs", "url": "https://github.com/rdohms/hero-superpackage" }       

]

Page 94: Composer: putting dependencies on the score

“hero/superpackage”: “dev-master”

    "repositories": [ { "type": "vcs", "url": "https://github.com/rdohms/hero-superpackage" }       

]

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

Page 95: Composer: putting dependencies on the score

{ "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'/$

Page 96: Composer: putting dependencies on the score

{ "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/" } } } ]}

“package”: on-the-fly package, injecting a composer.json

N!.-C!"p#$r P'*4'/$

Page 97: Composer: putting dependencies on the score

{ "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/" } } } ]}

SVN / Git

“package”: on-the-fly package, injecting a composer.json

N!.-C!"p#$r P'*4'/$

Page 98: Composer: putting dependencies on the score

I .$$- (+)0 PEAR p'*4'/$...No Problem!

Page 99: Composer: putting dependencies on the score

{ "repositories": [ { "type": "pear", "url": "http://pear2.php.net" } ], "require": { "pear-pear2.php.net/PEAR2_Text_Markdown": "*", "pear-pear2/PEAR2_HTTP_Request": "*" }}

Page 100: Composer: putting dependencies on the score

{ "repositories": [ { "type": "pear", "url": "http://pear2.php.net" } ], "require": { "pear-pear2.php.net/PEAR2_Text_Markdown": "*", "pear-pear2/PEAR2_HTTP_Request": "*" }}

“pear”: official PEAR and custom PEAR channels

Page 101: Composer: putting dependencies on the score

{ "repositories": [ { "type": "pear", "url": "http://pear2.php.net" } ], "require": { "pear-pear2.php.net/PEAR2_Text_Markdown": "*", "pear-pear2/PEAR2_HTTP_Request": "*" }}

“pear”: official PEAR and custom PEAR channels

Remember the prefix!

Page 102: Composer: putting dependencies on the score

{ "repositories": [ { "type": "pear", "url": "http://pear2.php.net" } ], "require": { "pear-pear2.php.net/PEAR2_Text_Markdown": "*", "pear-pear2/PEAR2_HTTP_Request": "*" }}

“pear”: official PEAR and custom PEAR channels

Remember the prefix!

Warning: PEAR causes a overhead of requests! !

Page 103: Composer: putting dependencies on the score

replace provide

alias

Page 104: Composer: putting dependencies on the score

replace provide

alias

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

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

Page 105: Composer: putting dependencies on the score

replace provide

alias

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

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

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

Page 106: Composer: putting dependencies on the score

replace provide

alias

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

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

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

“provide”: allows you to say a package provides a

expectation.

Page 107: Composer: putting dependencies on the score

1.-)./ ,!2r (2.$

Page 108: Composer: putting dependencies on the score

I .$$- ' &)br'r, (+'( -!$0..Let me get that for you

Page 109: Composer: putting dependencies on the score

http://packagist.org/

Page 110: Composer: putting dependencies on the score

versions

package info

usage info

Page 111: Composer: putting dependencies on the score

$ composer.phar search filter

Page 112: Composer: putting dependencies on the score

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 Symfonybrikou/zend_filter : Zend Framework Filter Libraryext-filter : The filter PHP extensiondms/dms-filter : DMS Library, includes various bundles and ...shtumi/useful-bundle : Symfony ShtumiUsefulBundle

$ composer.phar search filter

Page 113: Composer: putting dependencies on the score

$ composer.phar show dms/dms-filter-bundle

Page 114: Composer: putting dependencies on the score

name : dms/dms-filter-bundledescrip. : DMS Filter Bundle, makes Annotation based entity filtering available in Symfonykeywords : symfony, bundle, filter, dmsversions : dev-master, v1.1.1, v1.1, 1.0.2, 1.0.1, 1.0.0type : symfony-bundlelicense : MITsource : [git] https://github.com/rdohms/DMSFilterBundle v1.1.1dist : [zip] https://github.com/rdohms/DMSFilterBundle/zipball/v1.1.1 v1.1.1names : dms/dms-filter-bundle

autoloadpsr-0DMS\Bundle\FilterBundle => .

requiresphp >=5.3.2dms/dms-filter >=1.0.2

$ composer.phar show dms/dms-filter-bundle

Page 115: Composer: putting dependencies on the score

B2( ", r$p#)(!r, )0 pr)v'($!Get your own package repository

Page 116: Composer: putting dependencies on the score

S'()0!

Page 117: Composer: putting dependencies on the score

$ composer.phar create-project composer/satis

R!&&!2( ,!2r !w. S'()0

Page 118: Composer: putting dependencies on the score

$ 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

Page 119: Composer: putting dependencies on the score

$ composer.phar create-project composer/satis

$ vi packages.json

$ php bin/satis build config.json web/

{ "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

Page 120: Composer: putting dependencies on the score

{ "repositories": [ { "type": "composer", "url": "http://packages.yourdomain.net" } ],

“require”: { “myvendor/mypackage”: “dev-master” }}

U0)./ ,!2r !w. S'()0

Page 121: Composer: putting dependencies on the score

{ "repositories": [ { "type": "composer", "url": "http://packages.yourdomain.net" } ],

“require”: { “myvendor/mypackage”: “dev-master” }}

U0)./ ,!2r !w. S'()0“composer”: use this just like it was Packagist

Page 122: Composer: putting dependencies on the score

W+$r$ 0+!2&- I /$( +$&p?

http://getcomposer.org

#composer on irc.freenode.org

Page 123: Composer: putting dependencies on the score

%$ 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

Page 124: Composer: putting dependencies on the score

Q2$0()!.0?

http://slides.doh.ms

http://doh.ms

@rdohms