C!"p#$r Putting your dependencies on the score Rafael Dohms / @rdohms
May 10, 2015
C!"p#$rPutting your dependencies on the score
Rafael Dohms / @rdohms
phot
o cr
edit:
Eli W
hite
Evangelist, Speaker and Contributor.
Developer at WEBclusive.
Enabler at AmsterdamPHP.
Rafael Dohms@rdohms
%$ 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
open acceptance
spread out channels
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 ExternalsGit Submodules
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
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!
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
$ curl -s http://getcomposer.org/installer | php
$ curl -s http://getcomposer.org/installer | php -- --install-dir=bin
Local (embed)
Global
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:
I.0('&&)./ C!"p#$r
I.0('&&)./ C!"p#$r
$ composer.phar --version
Composer version 6573fd3
I.0('&&)./ C!"p#$r
$ composer.phar --version
Composer version 6573fd3
php
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
{ "require": { "silex/silex": "1.0.*" }, "minimum-stability": "dev"}
note: project root
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
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
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
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
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
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
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
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 fileGenerating 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/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/
I w'.( (! *!.(r)b2($ ' pr!5$*(Composer can set that up for you.
$ composer.phar create-project dms/dms --dev ~/dev/oss/dms
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
"require-dev": { "symfony/symfony": ">=2.1-dev", "doctrine/orm": "dev-master" },
$ 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
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": { "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
“psr-0”: PSR-0 Compatible libraries
"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
"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
I.0('&&)./, 2p-'()./ '.- "!v)./ !.how does Composer guarantee consistency
composer.json
“composer.json”: metadata and list of your dependencies.
composer.json
“composer.json”: metadata and list of your dependencies.
composer.lock
composer.json
“composer.json”: metadata and list of your dependencies.
“composer.lock”: existing dependencies and current commit hashes.
composer.lock
composer.json
composer.lock
composer.json
update
composer.lock
composer.json
update install
composer.lock
composer.json
update install
reads
composer.lock
composer.json
update install
reads
gets latest
composer.lock
composer.json
update install
reads
gets latest
writescomposer.lock
composer.json
update install
reads
gets latest
writes
reads
composer.lock
composer.json
update install
reads
gets latest
writes
reads
compares
composer.lock
composer.json
update install
reads
gets latest
writes
reads
gets locked version
compares
composer.lock
composer.json
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": "[email protected]", "issues": "http://issues.lib.com" } "target-dir": "/folder/to/install",}
{ "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!
{ "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
{ "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!
{ "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.
{ "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
M, *!-$ )0 PHP 5.4 !.&,!managing system dependencies
{ "require": { "php": ">=5.3.3", "ext-ldap": "*" }}
{ "require": { "php": ">=5.3.3", "ext-ldap": "*" }}
“php”: PHP version.
{ "require": { "php": ">=5.3.3", "ext-ldap": "*" }}
“php”: PHP version.
“ext-*”: Presence of selected extension
Up/r'-)./ (! ' M'$0(r!
B2( I .$$- ' 0p$*)6* v$r0)!.version modifiers to the rescue!
"acme/foo": "1.0.x-dev#3ebbe75"
"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"
“#<ref>”: Get this specific commit
“@<state>”: Get a version outside your default stability
I .$$- (! 7$*2($ ' f$w 0*r)p(0how to automate tasks with Composer
"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": { "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
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": [ { "type": "vcs", "url": "https://github.com/rdohms/hero-superpackage" }
]
“repositories”: point to non-indexed, override existing or on-the-fly packages
{ "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": [ { "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'/$
{ "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'/$
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": [ { "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
{ "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!
{ "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! !
replace provide
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”: allows you to replace other packages, and be used them in their place.
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.
1.-)./ ,!2r (2.$
I .$$- ' &)br'r, (+'( -!$0..Let me get that for you
versions
package info
usage info
$ 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 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
$ composer.phar show dms/dms-filter-bundle
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
B2( ", r$p#)(!r, )0 pr)v'($!Get your own package repository
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
$ 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
{ "repositories": [ { "type": "composer", "url": "http://packages.yourdomain.net" } ],
“require”: { “myvendor/mypackage”: “dev-master” }}
U0)./ ,!2r !w. S'()0
{ "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
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?
http://slides.doh.ms
http://doh.ms
@rdohms