Composer for Busy Developers - php|tek13

Preview:

Citation preview

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

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 --versionComposer version 7073d38

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

$ composer.phar --versionComposer version 7073d38

php

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

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

$ composer.phar self-updateUpdating to version 7073d38. Downloading: 100%

I’" b2)&-)./ ' Pr!4$*(How can composer manage your dependencies

C!"p#$r 101G$(()./ (+$ -$p$.-$.*)$0

C!"p#$r 101G$(()./ (+$ -$p$.-$.*)$0

$ cd ~/dev/myproject

C!"p#$r 101G$(()./ (+$ -$p$.-$.*)$0

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

{ "require": { "silex/silex": "~1.0" }}

C!"p#$r 101G$(()./ (+$ -$p$.-$.*)$0

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

{ "require": { "silex/silex": "~1.0" }}

put this in your project root

C!"p#$r 101G$(()./ (+$ -$p$.-$.*)$0

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

{ "require": { "silex/silex": "~1.0" }}

put this in your project root

“require”: required packages and versions

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

C!"p#$r 101G$(()./ (+$ -$p$.-$.*)$0

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

{ "require": { "silex/silex": "~1.0" }}

put this in your project root

“require”: required packages and versions

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

C!"p#$r 101G$(()./ (+$ -$p$.-$.*)$0

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

$ composer.phar install

{ "require": { "silex/silex": "~1.0" }}

put this in your project root

“require”: required packages and versions

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

Loading composer repositories with package informationInstalling dependencies - Installing psr/log (1.0.0) Loading from cache

- Installing symfony/routing (v2.2.1) Downloading: 100%

- Installing symfony/http-foundation (v2.2.1) Downloading: 100%

- Installing symfony/event-dispatcher (v2.2.1) Loading from cache

- Installing symfony/http-kernel (v2.2.1) Downloading: 100%

- Installing pimple/pimple (v1.0.2) Downloading: 100%

- Installing silex/silex (v1.0.0) Downloading: 100%

symfony/routing suggests installing symfony/config (2.2.*)symfony/routing suggests installing symfony/yaml (2.2.*)[...]silex/silex suggests installing symfony/dom-crawler (>=2.1,<2.4-dev)silex/silex suggests installing symfony/form (>= 2.1.4,<2.4-dev)Writing lock fileGenerating autoload files

Loading composer repositories with package informationInstalling dependencies - Installing psr/log (1.0.0) Loading from cache

- Installing symfony/routing (v2.2.1) Downloading: 100%

- Installing symfony/http-foundation (v2.2.1) Downloading: 100%

- Installing symfony/event-dispatcher (v2.2.1) Loading from cache

- Installing symfony/http-kernel (v2.2.1) Downloading: 100%

- Installing pimple/pimple (v1.0.2) Downloading: 100%

- Installing silex/silex (v1.0.0) Downloading: 100%

symfony/routing suggests installing symfony/config (2.2.*)symfony/routing suggests installing symfony/yaml (2.2.*)[...]silex/silex suggests installing symfony/dom-crawler (>=2.1,<2.4-dev)silex/silex suggests installing symfony/form (>= 2.1.4,<2.4-dev)Writing lock fileGenerating autoload files

your dependency’s dependencies

Loading composer repositories with package informationInstalling dependencies - Installing psr/log (1.0.0) Loading from cache

- Installing symfony/routing (v2.2.1) Downloading: 100%

- Installing symfony/http-foundation (v2.2.1) Downloading: 100%

- Installing symfony/event-dispatcher (v2.2.1) Loading from cache

- Installing symfony/http-kernel (v2.2.1) Downloading: 100%

- Installing pimple/pimple (v1.0.2) Downloading: 100%

- Installing silex/silex (v1.0.0) Downloading: 100%

symfony/routing suggests installing symfony/config (2.2.*)symfony/routing suggests installing symfony/yaml (2.2.*)[...]silex/silex suggests installing symfony/dom-crawler (>=2.1,<2.4-dev)silex/silex suggests installing symfony/form (>= 2.1.4,<2.4-dev)Writing lock fileGenerating autoload files

your dependency

your dependency’s dependencies

Loading composer repositories with package informationInstalling dependencies - Installing psr/log (1.0.0) Loading from cache

- Installing symfony/routing (v2.2.1) Downloading: 100%

- Installing symfony/http-foundation (v2.2.1) Downloading: 100%

- Installing symfony/event-dispatcher (v2.2.1) Loading from cache

- Installing symfony/http-kernel (v2.2.1) Downloading: 100%

- Installing pimple/pimple (v1.0.2) Downloading: 100%

- Installing silex/silex (v1.0.0) Downloading: 100%

symfony/routing suggests installing symfony/config (2.2.*)symfony/routing suggests installing symfony/yaml (2.2.*)[...]silex/silex suggests installing symfony/dom-crawler (>=2.1,<2.4-dev)silex/silex suggests installing symfony/form (>= 2.1.4,<2.4-dev)Writing lock fileGenerating autoload files

your dependency

your dependency’s dependencies

suggestions of other packages, for further

features

“~1.0”

V$r0)!.)./G$( (+$ -!(0 ). ' r!w

“>=1.0”

“>=1.0, <=1.1”

“1.0.*”

“~1.0”

V$r0)!.)./G$( (+$ -!(0 ). ' r!w

“>=1.0”

“>=1.0, <=1.1”

“1.0.*”

>=1.0, <=2.0: BC Compatible releases

V$r0)!.)./: D$vG$(()./ 0('b&$ !r -$v v$r0)!.0

V$r0)!.)./: D$vG$(()./ 0('b&$ !r -$v v$r0)!.0

“minimum-stability”: “stable”

V$r0)!.)./: D$vG$(()./ 0('b&$ !r -$v v$r0)!.0

“minimum-stability”: “stable”

No dev versions in dependency tree

V$r0)!.)./: D$vG$(()./ 0('b&$ !r -$v v$r0)!.0

“minimum-stability”: “stable”

No dev versions in dependency tree

“dms/dms”: “1.0.0@dev”

V$r0)!.)./: D$vG$(()./ 0('b&$ !r -$v v$r0)!.0

“minimum-stability”: “stable”

No dev versions in dependency tree

“dms/dms”: “1.0.0@dev”

Allow this package to use unstable versions

Q2)*5! I +'v$ '. )-$'!B!#(r'pp)./ Pr!4$*(0

Q2)*5! I +'v$ '. )-$'!B!#(r'pp)./ Pr!4$*(0

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

Q2)*5! I +'v$ '. )-$'!B!#(r'pp)./ Pr!4$*(0

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

Installing fabpot/silex-skeleton (v1.0.0) - Installing fabpot/silex-skeleton (v1.0.0) Downloading: 100%

Created project in projectLoading composer repositories with package informationInstalling dependencies - Installing pimple/pimple (dev-master) Cloning d2cfa2f02f50abef65c238747c753a5f6786f6be

[...]

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

Writing lock fileGenerating autoload files

Q2)*5! I +'v$ '. )-$'!B!#(r'pp)./ Pr!4$*(0

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

Installing fabpot/silex-skeleton (v1.0.0) - Installing fabpot/silex-skeleton (v1.0.0) Downloading: 100%

Created project in projectLoading composer repositories with package informationInstalling 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/

A--)./ .$w R$q2)r$"$.(0

$ composer.phar require symfony/yaml=~2.1.0

A--)./ .$w R$q2)r$"$.(0

$ composer.phar require symfony/yaml=~2.1.0

composer.json has been updatedLoading composer repositories with package informationUpdating dependencies - Installing symfony/yaml (v2.1.8) Downloading: 100%

Writing lock fileGenerating autoload files

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 .$$- ,!2r 0$rv$r (! +'v$ (+$0$..C+$*5)./ 0,0($" -$p$.-$.*)$0

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

I .$$- ,!2r 0$rv$r (! +'v$ (+$0$..C+$*5)./ 0,0($" -$p$.-$.*)$0

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

“php”: PHP version.

I .$$- ,!2r 0$rv$r (! +'v$ (+$0$..C+$*5)./ 0,0($" -$p$.-$.*)$0

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

“php”: PHP version.

“ext-*”: Presence of selected extension

I .$$- ,!2r 0$rv$r (! +'v$ (+$0$..C+$*5)./ 0,0($" -$p$.-$.*)$0

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

K$$p (+$ ($'" !. (+$ 0'"$ p'/$

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

composer install.

I’" -$v$&!p)./ ' &)br'r,, +$&p!how can composer spread my library around?

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

“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": "support@mylib.com", "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": "support@mylib.com", "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": "support@mylib.com", "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

Q2)*5! I w'..' p'(*+ (+)0!B!!(0(r'pp)./ L)br'r, C!.(r)b2()!.

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

Q2)*5! I w'..' p'(*+ (+)0!B!!(0(r'pp)./ L)br'r, C!.(r)b2()!.

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

Q2)*5! I w'..' p'(*+ (+)0!B!!(0(r'pp)./ L)br'r, C!.(r)b2()!.

gimme dev packages

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

Q2)*5! I w'..' p'(*+ (+)0!B!!(0(r'pp)./ L)br'r, C!.(r)b2()!.

gimme dev packages

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

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

Q2)*5! I w'..' p'(*+ (+)0!B!!(0(r'pp)./ L)br'r, C!.(r)b2()!.

gimme dev packages

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

“require-dev”: only needed if you are going to contribute/develop the library

T'/ ,!2r r$&$'0$0!use semver and always make tags for releases

T'/ ,!2r r$&$'0$0!use semver and always make tags for releases

X.Y.Z

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": "@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\\...Composer\\ScriptHandler::buildBootstrap",            "Sensio\\...Composer\\ScriptHandler::clearCache",            "Sensio\\...Composer\\ScriptHandler::installAssets",            "Sensio\\...Composer\\ScriptHandler::installRequirementsFile"        ],        "post-update-cmd": [            "Sensio\\...Composer\\ScriptHandler::buildBootstrap",            "Sensio\\...Composer\\ScriptHandler::clearCache",            "Sensio\\...Composer\\ScriptHandler::installAssets",            "Sensio\\...Composer\\ScriptHandler::installRequirementsFile"        ]    },

    "scripts": {        "post-install-cmd": [            "Sensio\\...Composer\\ScriptHandler::buildBootstrap",            "Sensio\\...Composer\\ScriptHandler::clearCache",            "Sensio\\...Composer\\ScriptHandler::installAssets",            "Sensio\\...Composer\\ScriptHandler::installRequirementsFile"        ],        "post-update-cmd": [            "Sensio\\...Composer\\ScriptHandler::buildBootstrap",            "Sensio\\...Composer\\ScriptHandler::clearCache",            "Sensio\\...Composer\\ScriptHandler::installAssets",            "Sensio\\...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" }       

]my fork

“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

my fork

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

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

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

I .$$- (+)0 PEAR p'*5'/$...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! !

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

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

http://packagist.org/

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!""!#$ %!#r !w& S'$()

$ 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!""!#$ %!#r !w& S'$()

$ 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!""!#$ %!#r !w& S'$()

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

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

U)(&* %!#r !w& S'$()

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

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

U)(&* %!#r !w& S'$()“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

https://joind.in/8178

Recommended