Contenu connexe Similaire à Shifting gears with Composer Similaire à Shifting gears with Composer (20) Shifting gears with Composer5. Who am I?
• I am from Spain
• I live in London
• I work for IPC Media
6. Who am I?
• I am from Spain
• I live in London
• I work for IPC Media
• I tweet as @loalf
7. Who am I?
• I am from Spain
• I live in London
• I work for IPC Media
• I tweet as @loalf
• I co-organize DeSymfony (www.desymfony.com)
8. Who am I?
• I am from Spain
• I live in London
• I work for IPC Media
• I tweet as @loalf
• I co-organize DeSymfony (www.desymfony.com)
Still want to know more?
http://www.linkedin.com/in/loalf
15. Composer is a tool for dependency management in PHP.
It allows you to declare the dependent libraries your project needs and it will
install them in your project for you.
19. Is it a new concept? Nope.
Node Package Manager
20. Is it a new concept? Nope.
Node Package Manager
Ruby Package Manager
24. But, what about PEAR?
• You have to install it in all the system
• You can´t see the source code
25. But, what about PEAR?
• You have to install it in all the system
• You can´t see the source code
• Don´t allow different repository sources
26. But, what about PEAR?
• You have to install it in all the system
• You can´t see the source code
• Don´t allow different repository sources
• Composer is compatible with PEAR, :)
33. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
34. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
35. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
36. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
37. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
38. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
39. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
40. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
41. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
42. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
43. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
44. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
45. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
46. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
47. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
48. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
49. // composer.json
{
"require" : {
"monolog/monolog" : "1.0.*",
"symfony/translation" : "2.1.0-RC1",
"behat/behat" : ">2.3.5,<2.4",
"fabpot/goutte" : "dev-master"
},
"minimum-stability": "dev"
}
51. Installing dependencies
- Installing guzzle/parser (v2.8.4)
Downloading: 100%
- Installing symfony/event-dispatcher (dev-master)
Cloning v2.1.0-BETA4
- Installing guzzle/common (v2.8.4)
Downloading: 100%
- Installing guzzle/http (v2.8.4)
Downloading: 100%
- Installing symfony/process (dev-master)
Cloning v2.1.0-RC1
- Installing symfony/finder (dev-master)
Cloning 1af11ab3a686f9c45f2a8d9d721d5717cdd5f1d6
73. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
74. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
75. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
76. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
77. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
78. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
79. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
80. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
81. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
82. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
83. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
84. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
85. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
86. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
87. // composer.josn
{
"name": "monolog/monolog",
"type": "library",
"description": "Logging for PHP 5.3",
"keywords": ["log","logging"],
"homepage": "http://github.com/Seldaek/monolog",
"license": "MIT",
"authors": [
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
"homepage": "http://seld.be",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Monolog": "src"
}
}
}
88. // composer.josn
{
"name": "monolog/monolog",
[ ... ]
"autoload": {
"psr-0": {
"Monolog": ["src", "lib"]
}
}
}
89. // composer.josn
{
"name": "monolog/monolog",
[ ... ]
"autoload": {
"classmap": ["src", "lib"]
}
}
90. // composer.josn
{
"name": "monolog/monolog",
[ ... ]
"autoload": {
"files": "src/myfunctions.php"
}
}
93. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "http://github.com/loalf/symfony"
}
],
"require": {
"symfony/symfony" : "dev-patch2"
}
}
94. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "http://github.com/loalf/symfony"
}
],
"require": {
"symfony/symfony" : "dev-patch2"
}
}
95. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "http://github.com/loalf/symfony"
}
],
"require": {
"symfony/symfony" : "dev-patch2"
}
}
96. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "http://github.com/loalf/symfony"
}
],
"require": {
"symfony/symfony" : "dev-patch2"
}
}
97. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "http://github.com/loalf/symfony"
}
],
"require": {
"symfony/symfony" : "dev-patch2"
}
}
98. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "http://github.com/loalf/symfony"
}
],
"require": {
"symfony/symfony" : "dev-patch2"
}
}
99. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "http://github.com/loalf/symfony"
}
],
"require": {
"symfony/symfony" : "dev-patch2"
}
}
100. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "http://github.com/loalf/symfony"
}
],
"require": {
"symfony/symfony" : "dev-patch2"
}
}
101. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "http://github.com/loalf/symfony"
}
],
"require": {
"symfony/symfony" : "dev-patch2"
}
}
103. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "svn://company.com/lib"
}
],
"require": {
"company/lib" : "1.2.1"
}
}
104. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "svn://company.com/lib"
}
],
"require": {
"company/lib" : "1.2.1"
}
}
105. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "svn://company.com/lib"
}
],
"require": {
"company/lib" : "1.2.1"
}
}
106. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "svn://company.com/lib"
}
],
"require": {
"company/lib" : "1.2.1"
}
}
107. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "svn://company.com/lib"
}
],
"require": {
"company/lib" : "1.2.1"
}
}
108. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "svn://company.com/lib"
}
],
"require": {
"company/lib" : "1.2.1"
}
}
109. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "svn://company.com/lib"
}
],
"require": {
"company/lib" : "1.2.1"
}
}
110. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "svn://company.com/lib"
}
],
"require": {
"company/lib" : "1.2.1"
}
}
111. // composer.json
{
"repositories": [
{
"type" : "cvs",
"url" : "svn://company.com/lib"
}
],
"require": {
"company/lib" : "1.2.1"
}
}
113. // composer.json
{
"repositories": [
{
"type" : "pear",
"url" : "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_HTTP_Request" : "*"
}
}
114. // composer.json
{
"repositories": [
{
"type" : "pear",
"url" : "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_HTTP_Request" : "*"
}
}
115. // composer.json
{
"repositories": [
{
"type" : "pear",
"url" : "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_HTTP_Request" : "*"
}
}
116. // composer.json
{
"repositories": [
{
"type" : "pear",
"url" : "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_HTTP_Request" : "*"
}
}
117. // composer.json
{
"repositories": [
{
"type" : "pear",
"url" : "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_HTTP_Request" : "*"
}
}
118. // composer.json
{
"repositories": [
{
"type" : "pear",
"url" : "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_HTTP_Request" : "*"
}
}
119. // composer.json
{
"repositories": [
{
"type" : "pear",
"url" : "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_HTTP_Request" : "*"
}
}
120. // composer.json
{
"repositories": [
{
"type" : "pear",
"url" : "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_HTTP_Request" : "*"
}
}
121. // composer.json
{
"repositories": [
{
"type" : "pear",
"url" : "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_HTTP_Request" : "*"
}
}
123. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
124. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
125. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
126. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
127. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
128. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
129. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
130. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
131. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
132. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
133. // composer.json
{
"repositories" : [
{
"type": "package",
"package": {
"name": "jquery/jquery",
"version": "1.7.2",
"dist": {
"url": "http://code.jquery.com/jquery-1.7.2.js",
"type": "file"
}
}
}
],
"require" : {
"jquery/jquery" : "1.7.2"
}
}
134. Excuse #5
I need a private package
repository, but Packagist is too
demanding
137. 1200 250
watchs forks
140. 2703
2418
2703 1881
packages 1447
1004
692
478
347
204
139
2011-09 48 2011-11 2012-01 2012-03 2012-05 2012-07
7
141. 2703
2418
2703 1881
packages 1447
1004
692
478
347
287
204
139
2011-09 48 2011-11 2012-01 2012-03 2012-05 2012-07
7
588