Your SlideShare is downloading. ×
Game Changing Dependency Management
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Game Changing Dependency Management

1,328
views

Published on


0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,328
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Composer Game Changing Dependency Management TechCamp Memphis 2013 Saturday, November 2, 13 Jeremy Kendall
  • 2. Saturday, November 2, 13
  • 3. I love to code Saturday, November 2, 13
  • 4. I love to code I’m terribly forgetful Saturday, November 2, 13
  • 5. I love to code I’m terribly forgetful I take pictures Saturday, November 2, 13
  • 6. I love to code I’m terribly forgetful I take pictures I work at OpenSky Saturday, November 2, 13
  • 7. Adding Dependencies is Easy Saturday, November 2, 13
  • 8. Adding Dependencies is Easy ‣ Saturday, November 2, 13 Copy and Paste
  • 9. Adding Dependencies is Easy ‣ DIY Solution ‣ Copy and Paste Saturday, November 2, 13
  • 10. Adding Dependencies is Easy ‣ DIY Solution ‣ SVN Externals ‣ Copy and Paste Saturday, November 2, 13
  • 11. Adding Dependencies is Easy ‣ DIY Solution ‣ SVN Externals ‣ Git Submodules ‣ Copy and Paste Saturday, November 2, 13
  • 12. Managing them is Messy Saturday, November 2, 13
  • 13. What is Composer? Saturday, November 2, 13
  • 14. What is Composer? ‣ Saturday, November 2, 13 Dependency management tool
  • 15. What is Composer? ‣ Per-project ‣ Dependency management tool Saturday, November 2, 13
  • 16. What is Composer? ‣ Per-project ‣ Inspired by: ‣ Dependency management tool Saturday, November 2, 13
  • 17. What is Composer? ‣ Per-project ‣ Inspired by: ‣ node’s npm ‣ Dependency management tool Saturday, November 2, 13
  • 18. What is Composer? ‣ Per-project ‣ Inspired by: ‣ node’s npm ‣ ruby’s bundler ‣ Dependency management tool Saturday, November 2, 13
  • 19. Benefits Saturday, November 2, 13
  • 20. Benefits ‣ Saturday, November 2, 13 Easily declare project dependencies
  • 21. Benefits ‣ Updating dependency versions extremely simple ‣ Easily declare project dependencies Saturday, November 2, 13
  • 22. Benefits ‣ Updating dependency versions extremely simple ‣ Ensures your team is on the same page ‣ Easily declare project dependencies Saturday, November 2, 13
  • 23. Benefits ‣ Updating dependency versions extremely simple ‣ Ensures your team is on the same page ‣ Tons of excellent related features ‣ Easily declare project dependencies Saturday, November 2, 13
  • 24. Installing Saturday, November 2, 13
  • 25. Installing Locally In your project: Saturday, November 2, 13 $ curl -sS https://getcomposer.org/installer | php
  • 26. Installing Locally In your project: Specify a directory: Saturday, November 2, 13 $ curl -sS https://getcomposer.org/installer | php $ curl -sS https://getcomposer.org/installer | php -- --install-dir=bin
  • 27. Installing Locally In your project: Specify a directory: What you’ll see: $ curl -sS https://getcomposer.org/installer | php $ curl -sS https://getcomposer.org/installer | php -- --install-dir=bin $ curl -sS https://getcomposer.org/installer | php #!/usr/bin/env php All settings correct for using Composer Downloading... Composer successfully installed to: /Users/jkendall/dev/ composer.phar Use it: php composer.phar Saturday, November 2, 13
  • 28. Installing Globally Recommended $ curl -sS https://getcomposer.org/installer | php $ mv composer.phar /usr/local/bin/composer Saturday, November 2, 13
  • 29. Installing Globally Recommended $ curl -sS https://getcomposer.org/installer | php $ mv composer.phar /usr/local/bin/composer (You might need to use sudo) Saturday, November 2, 13
  • 30. (There’s an installer for Windows folks) Saturday, November 2, 13
  • 31. Keeping up to Date $ php composer.phar self-update You are using the latest composer version. or $ composer self-update You are using the latest composer version. Saturday, November 2, 13
  • 32. Keeping up to Date $ php composer.phar self-update You are using the latest composer version. or $ composer self-update You are using the latest composer version. (Always updates to the latest dev-master) Saturday, November 2, 13
  • 33. Defining Dependencies Saturday, November 2, 13
  • 34. composer.json { "require": { "monolog/monolog": "1.6.*" } } Saturday, November 2, 13
  • 35. composer.json { "require": { "monolog/monolog": "1.6.*" } } ‣Place in the root of your project Saturday, November 2, 13
  • 36. composer.json { "require": { "monolog/monolog": "1.6.*" } } ‣Place in the root of your project ‣“require” specifies package and version Saturday, November 2, 13
  • 37. composer.json { "require": { "monolog/monolog": "1.6.*" } } ‣Place in the root of your project ‣“require” specifies package and version ‣monolog logging library Saturday, November 2, 13
  • 38. composer.json { "require": { "monolog/monolog": "1.6.*" } } ‣Place in the root of your project ‣“require” specifies package and version ‣monolog logging library ‣Version >= 1.6.0 and < 1.7 Saturday, November 2, 13
  • 39. composer.json { "require": { "monolog/monolog": "1.6.*" } } ‣Place in the root of your project ‣“require” specifies package and version ‣monolog logging library ‣Version >= 1.6.0 and < 1.7 ‣No fuss, no muss Saturday, November 2, 13
  • 40. Versions Saturday, November 2, 13
  • 41. Versions ‣ Saturday, November 2, 13 Exact version: 1.0.0, 12.2.4, etc.
  • 42. Versions ‣ Wildcard: 3.*, 4.2.* ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  • 43. Versions ‣ Wildcard: 3.*, 4.2.* ‣ Range: >, >=, <=, != ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  • 44. Versions ‣ Wildcard: 3.*, 4.2.* ‣ Range: >, >=, <=, != ‣ Example: >=2.4 ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  • 45. Versions ‣ Wildcard: 3.*, 4.2.* ‣ Range: >, >=, <=, != ‣ Example: >=2.4 ‣ Range: >=1.0,<1.7 (comma separated) ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  • 46. Versions ‣ Wildcard: 3.*, 4.2.* ‣ Range: >, >=, <=, != ‣ Example: >=2.4 ‣ Range: >=1.0,<1.7 (comma separated) ‣ Next Significant Release: ~1.3.3 ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  • 47. Installing Dependencies composer install $ composer install Loading composer repositories with package information Installing dependencies (including require-dev) - Installing psr/log (1.0.0) Loading from cache - Installing monolog/monolog (1.6.0) Loading from cache monolog/monolog suggests installing monolog/monolog suggests installing monolog/monolog suggests installing monolog/monolog suggests installing Writing lock file Generating autoload files Saturday, November 2, 13 mlehner/gelf-php (Allow sending log messages to a GrayLog2 server) raven/raven (Allow sending log messages to a Sentry server) doctrine/couchdb (Allow sending log messages to a CouchDB server) ext-amqp (Allow sending log messages to an AMQP server (1.0+ required))
  • 48. composer.lock Saturday, November 2, 13
  • 49. composer.lock ‣ Saturday, November 2, 13 install writes a dependency lock file
  • 50. composer.lock ‣ List of exact versions installed ‣ install writes a dependency lock file Saturday, November 2, 13
  • 51. composer.lock ‣ List of exact versions installed ‣ Commit both composer.lock and composer.json ‣ install writes a dependency lock file Saturday, November 2, 13
  • 52. composer.lock ‣ List of exact versions installed ‣ Commit both composer.lock and composer.json ‣ install writes a dependency lock file ‣ composer install now checks the lock file, not composer.json Saturday, November 2, 13
  • 53. composer.lock ‣ List of exact versions installed ‣ Commit both composer.lock and composer.json ‣ install writes a dependency lock file ‣ composer install now checks the lock file, not composer.json ‣ Saturday, November 2, 13 Update dependencies with composer update
  • 54. Updating Dependencies Saturday, November 2, 13
  • 55. Updating Dependencies { "require": { "monolog/monolog": "1.6.*@dev" } } Saturday, November 2, 13
  • 56. Updating Dependencies { "require": { "monolog/monolog": "1.6.*@dev" } } ‣Updates monolog library version Saturday, November 2, 13
  • 57. Updating Dependencies { "require": { "monolog/monolog": "1.6.*@dev" } } ‣Updates monolog library version ‣Version >= 1.6.0 and < 1.7 (dev) Saturday, November 2, 13
  • 58. Updating Dependencies composer update $ composer update Loading composer repositories with package information Updating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7 Writing lock file Generating autoload files Saturday, November 2, 13
  • 59. Updating Dependencies composer update $ composer update Loading composer repositories with package information Updating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7 Writing lock file Generating autoload files ‣Reads from composer.json Saturday, November 2, 13
  • 60. Updating Dependencies composer update $ composer update Loading composer repositories with package information Updating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7 Writing lock file Generating autoload files ‣Reads from composer.json ‣Updates dependencies Saturday, November 2, 13
  • 61. Updating Dependencies composer update $ composer update Loading composer repositories with package information Updating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7 Writing lock file Generating autoload files ‣Reads from composer.json ‣Updates dependencies ‣Rewrites lock file Saturday, November 2, 13
  • 62. Adding New Dependencies Edit composer.json . . . { "require": { "monolog/monolog": "1.6.*@dev", "ircmaxell/password-compat": "1.0.3" } } Saturday, November 2, 13
  • 63. Adding New Dependencies Or use the command line composer require $ composer require ircmaxell/password-compat:1.0.3 composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) - Installing ircmaxell/password-compat (1.0.3) Downloading: 100% Writing lock file Generating autoload files Saturday, November 2, 13
  • 64. Autoloading Saturday, November 2, 13
  • 65. Autoloading ‣ Saturday, November 2, 13 Composer generates vendor/autoload.php
  • 66. Autoloading ‣ Add require ‘vendor/autoload.php’; ‣ Composer generates vendor/autoload.php Saturday, November 2, 13
  • 67. Autoloading ‣ Add require ‘vendor/autoload.php’; ‣ Immediately begin using your dependencies ‣ Composer generates vendor/autoload.php Saturday, November 2, 13
  • 68. Autoloading Don’t forget to add your own code! { "require": { "monolog/monolog": "1.6.*@dev" }, "autoload": { "psr-0": { "Beeblebrox": "src/" } } } Saturday, November 2, 13
  • 69. Autoloading Pro Tip Grab an autoloader instance and add more namespaces. $loader = require 'vendor/autoload.php'; $loader->add('AcmeTest', __DIR__); Saturday, November 2, 13
  • 70. Kickstart a Project composer create-project $ composer create-project slim/slim-skeleton super-sweet-application Installing slim/slim-skeleton (1.1.0) - Installing slim/slim-skeleton (1.1.0) Downloading: 100% Created project in super-sweet-application Loading composer repositories with package information Installing dependencies (including require-dev) - Installing slim/slim (2.3.0) Downloading: 100% - Installing slim/extras (2.0.3) Loading from cache - Installing twig/twig (v1.13.1) Loading from cache Writing lock file Generating autoload files Saturday, November 2, 13
  • 71. Little Bobby Tables as a Service composer create-project jeremykendall/lbtaas lbtaas Saturday, November 2, 13
  • 72. Little Bobby Tables as a Service http://lbtaas.dev { "status":"success", "data":{ "name":"Exploits of a Mom", "permalink":"http://xkcd.com/327/", "image":"http://imgs.xkcd.com/comics/exploits_of_a_mom.png" } } Saturday, November 2, 13
  • 73. Your Very Own Library Saturday, November 2, 13
  • 74. Libraries Saturday, November 2, 13
  • 75. Libraries ‣ Saturday, November 2, 13 Everyone has written a library of some sort
  • 76. Libraries ‣ Making up examples is not my strong suit ‣ Everyone has written a library of some sort Saturday, November 2, 13
  • 77. Libraries ‣ Making up examples is not my strong suit ‣ Let’s walk through a real library . . . ‣ Everyone has written a library of some sort Saturday, November 2, 13
  • 78. Libraries ‣ Making up examples is not my strong suit ‣ Let’s walk through a real library . . . ‣ . . . and check out some awesome Composer features ‣ Everyone has written a library of some sort Saturday, November 2, 13
  • 79. PHP Domain Parser https://github.com/jeremykendall/php-domain-parser Saturday, November 2, 13
  • 80. { } Saturday, November 2, 13 "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] }
  • 81. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Package requirements } Saturday, November 2, 13
  • 82. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Package requirements } Saturday, November 2, 13 Autoloading
  • 83. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Add the “name” key and it’s installable } Saturday, November 2, 13
  • 84. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Additional metadata } Saturday, November 2, 13
  • 85. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Don’t forget the license! } Saturday, November 2, 13
  • 86. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Full fledged library! } Saturday, November 2, 13
  • 87. Now for the cool(er) stuff . . . Saturday, November 2, 13
  • 88. { } Saturday, November 2, 13 "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } require-dev
  • 89. require-dev Saturday, November 2, 13
  • 90. require-dev ‣ Saturday, November 2, 13 Lists packages required for development (think tests)
  • 91. require-dev ‣ Only applies to the root package ‣ Lists packages required for development (think tests) Saturday, November 2, 13
  • 92. require-dev ‣ Only applies to the root package ‣ Both install and update install require-dev by default ‣ Lists packages required for development (think tests) Saturday, November 2, 13
  • 93. require-dev ‣ Only applies to the root package ‣ Both install and update install require-dev by default ‣ (Use the --no-dev flag to skip installing dev ‣ dependencies) Lists packages required for development (think tests) Saturday, November 2, 13
  • 94. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], } Saturday, November 2, 13 bin "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] }
  • 95. bin Saturday, November 2, 13
  • 96. bin ‣ Saturday, November 2, 13 cli scripts to pass along to package users
  • 97. bin ‣ A set of files that should be treated as binaries ‣ cli scripts to pass along to package users Saturday, November 2, 13
  • 98. bin ‣ A set of files that should be treated as binaries ‣ Installs binaries to vendor/bin for any project that ‣ depends on your project cli scripts to pass along to package users Saturday, November 2, 13
  • 99. bin ‣ A set of files that should be treated as binaries ‣ Installs binaries to vendor/bin for any project that ‣ depends on your project cli scripts to pass along to package users ‣ Saturday, November 2, 13 php-domain-parser uses a bin to update the local copy of the public suffix list
  • 100. { } Saturday, November 2, 13 "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } scripts
  • 101. scripts Saturday, November 2, 13
  • 102. scripts ‣ Saturday, November 2, 13 Used to execute custom code during the Composer execution process
  • 103. scripts ‣ ‣ Saturday, November 2, 13 Used to execute custom code during the Composer execution process PHP callback (defined as a static method) . . .
  • 104. scripts ‣ Used to execute custom code during the Composer execution process ‣ . . . or any command-line executable command ‣ PHP callback (defined as a static method) . . . Saturday, November 2, 13
  • 105. scripts ‣ Used to execute custom code during the Composer execution process ‣ . . . or any command-line executable command ‣ Only scripts defined in the root composer.json are ‣ executed PHP callback (defined as a static method) . . . Saturday, November 2, 13
  • 106. scripts ‣ Used to execute custom code during the Composer execution process ‣ . . . or any command-line executable command ‣ Only scripts defined in the root composer.json are ‣ executed PHP callback (defined as a static method) . . . ‣ Saturday, November 2, 13 If a script is defined in a dependency, you can use it in your composer.json
  • 107. scripts Saturday, November 2, 13
  • 108. scripts ‣ Saturday, November 2, 13 Composer fires “named events” during execution
  • 109. scripts ‣ Named events include: ‣ Composer fires “named events” during execution Saturday, November 2, 13
  • 110. scripts ‣ Named events include: ‣ pre- and post-install-cmd ‣ Composer fires “named events” during execution Saturday, November 2, 13
  • 111. scripts ‣ Named events include: ‣ pre- and post-install-cmd ‣ pre- and post-update-cmd ‣ Composer fires “named events” during execution Saturday, November 2, 13
  • 112. scripts ‣ Named events include: ‣ pre- and post-install-cmd ‣ pre- and post-update-cmd ‣ post-root-package-install ‣ Composer fires “named events” during execution Saturday, November 2, 13
  • 113. scripts ‣ Named events include: ‣ pre- and post-install-cmd ‣ pre- and post-update-cmd ‣ post-root-package-install ‣ Many more . . . ‣ Composer fires “named events” during execution Saturday, November 2, 13
  • 114. Running scripts Saturday, November 2, 13
  • 115. Running scripts Execute Composer (script will execute if the named event is triggered) or . . . Saturday, November 2, 13
  • 116. Running scripts Execute Composer (script will execute if the named event is triggered) or . . . Saturday, November 2, 13
  • 117. Running scripts Execute Composer (script will execute if the named event is triggered) or . . . composer run-script <named event> Saturday, November 2, 13
  • 118. Example public static function create(Event $event) { $dir = dirname($event->getComposer()->getConfig()->get('vendor-dir')); $io = $event->getIO(); $io->write('Reviewing your Flaming Archer environment . . .', true); $configExists = file_exists($dir . '/config.php'); $configDistExists = file_exists($dir . '/config-dist.php'); if (!$configExists && $configDistExists) { $io->write('Creating config.php by copying config-dist.php . . .', true); copy($dir . '/config-dist.php', $dir . '/config.php'); $io->write("Done! Please edit config.php.", true); } else { $io->write('Found config.php.', true); } } https://github.com/jeremykendall/flaming-archer/blob/develop/library/Fa/Composer/Script/Config.php Saturday, November 2, 13
  • 119. You’ve built your library. Now what? Saturday, November 2, 13
  • 120. Push it to a VCS Saturday, November 2, 13
  • 121. Push it to a VCS ‣ Saturday, November 2, 13 git, svn, or hg all work equally well
  • 122. Push it to a VCS ‣ For the sake of simplicity I’ll assume git/github ‣ git, svn, or hg all work equally well Saturday, November 2, 13
  • 123. Push it to a VCS ‣ For the sake of simplicity I’ll assume git/github ‣ Package versions: ‣ git, svn, or hg all work equally well Saturday, November 2, 13
  • 124. Push it to a VCS ‣ For the sake of simplicity I’ll assume git/github ‣ Package versions: ‣ Tags are package versions (1.0.0, v2.5.4, etc) ‣ git, svn, or hg all work equally well Saturday, November 2, 13
  • 125. Push it to a VCS ‣ For the sake of simplicity I’ll assume git/github ‣ Package versions: ‣ Tags are package versions (1.0.0, v2.5.4, etc) ‣ Branches are dev versions (dev-{branchname}, ‣ {branchname}-dev) git, svn, or hg all work equally well Saturday, November 2, 13
  • 126. Push it to a VCS ‣ For the sake of simplicity I’ll assume git/github ‣ Package versions: ‣ Tags are package versions (1.0.0, v2.5.4, etc) ‣ Branches are dev versions (dev-{branchname}, ‣ {branchname}-dev) git, svn, or hg all work equally well ‣ Saturday, November 2, 13 For this reason, I strongly recommend using semantic versioning: http://semver.org
  • 127. Share! Saturday, November 2, 13
  • 128. Packagist Saturday, November 2, 13
  • 129. Packagist Saturday, November 2, 13
  • 130. Packagist ‣ Saturday, November 2, 13 The main package repository for Composer
  • 131. Packagist ‣ (Aside: Search Packagist before “rolling your own”) ‣ The main package repository for Composer Saturday, November 2, 13
  • 132. Packagist ‣ (Aside: Search Packagist before “rolling your own”) ‣ Packages published there need no special settings in ‣ composer.json to be installable (see “repositories” key) The main package repository for Composer Saturday, November 2, 13
  • 133. Packagist ‣ (Aside: Search Packagist before “rolling your own”) ‣ Packages published there need no special settings in ‣ composer.json to be installable (see “repositories” key) The main package repository for Composer ‣ Saturday, November 2, 13 Submitting is dead simple
  • 134. Packagist ‣ (Aside: Search Packagist before “rolling your own”) ‣ Packages published there need no special settings in ‣ composer.json to be installable (see “repositories” key) The main package repository for Composer ‣ Create account, hit big green submit button ‣ Submitting is dead simple Saturday, November 2, 13
  • 135. Packagist Saturday, November 2, 13
  • 136. Packagist: Package Search Saturday, November 2, 13
  • 137. Packagist: Keyword Search Saturday, November 2, 13
  • 138. Packagist: Package Saturday, November 2, 13
  • 139. But what about internal proprietary packages? Saturday, November 2, 13
  • 140. Satis to the Rescue Saturday, November 2, 13
  • 141. Satis to the Rescue ‣ Saturday, November 2, 13 Static composer repository generator
  • 142. Satis to the Rescue ‣ Lightweight, static file based version of Packagist ‣ Static composer repository generator Saturday, November 2, 13
  • 143. Satis to the Rescue ‣ Lightweight, static file based version of Packagist ‣ Simple to configure ‣ Static composer repository generator Saturday, November 2, 13
  • 144. Satis to the Rescue ‣ Lightweight, static file based version of Packagist ‣ Simple to configure ‣ Flexible ‣ Static composer repository generator Saturday, November 2, 13
  • 145. composer create-project composer/satis --stability=dev $ composer create-project composer/satis --stability=dev --keep-vcs Installing composer/satis (dev-master 059588ef0fd0977964ad13637e02012519686202) - Installing composer/satis (dev-master master) Cloning master Created project in /Users/jkendall/dev/satis Loading composer repositories with package information Installing dependencies (including require-dev) from lock file Warning: The lock file is not up to date with the latest changes in composer.json . . . - Installing symfony/process (dev-master 75c8101) Cloning 75c810176f8e069714cef8696d7ecc3aa86e8168 - [ . . . ] - Installing twig/twig (v1.13.1) Loading from cache symfony/console suggests installing symfony/event-dispatcher () Generating autoload files Saturday, November 2, 13
  • 146. Satis config.json { "name": "Satis Demo", "homepage": "http://satis.dev", "repositories": [ { "type": "vcs", "url": "https://github.com/jeremykendall/php-domain-parser" }, { "type": "vcs", "url": "https://github.com/jeremykendall/phpctagger" } ], "require": { "jeremykendall/php-domain-parser": ">=0.0.5", "jeremykendall/phpctagger": ">0.0.6" }, "archive": { "directory": "dist", "format": "tar" } } Saturday, November 2, 13
  • 147. Satis config.json { "name": "Satis Demo", "homepage": "http://satis.dev", "repositories": [ { "type": "vcs", "url": "https://github.com/jeremykendall/php-domain-parser" }, { "type": "vcs", "url": "https://github.com/jeremykendall/phpctagger" } ], "require": { "jeremykendall/php-domain-parser": ">=0.0.5", "jeremykendall/phpctagger": ">0.0.6" }, "archive": { "directory": "dist", "format": "tar" } } Saturday, November 2, 13
  • 148. Satis config.json { "name": "Satis Demo", "homepage": "http://satis.dev", "repositories": [ { "type": "vcs", "url": "https://github.com/jeremykendall/php-domain-parser" }, { "type": "vcs", "url": "https://github.com/jeremykendall/phpctagger" } ], "require": { "jeremykendall/php-domain-parser": ">=0.0.5", "jeremykendall/phpctagger": ">0.0.6" }, "archive": { "directory": "dist", "format": "tar" } } Saturday, November 2, 13
  • 149. Satis config.json { "name": "Satis Demo", "homepage": "http://satis.dev", "repositories": [ { "type": "vcs", "url": "https://github.com/jeremykendall/php-domain-parser" }, { "type": "vcs", "url": "https://github.com/jeremykendall/phpctagger" } ], "require": { "jeremykendall/php-domain-parser": ">=0.0.5", "jeremykendall/phpctagger": ">0.0.6" }, "archive": { "directory": "dist", "format": "tar" } } Saturday, November 2, 13
  • 150. Satis config.json { "name": "Satis Demo", "homepage": "http://satis.dev", "repositories": [ { "type": "vcs", "url": "https://github.com/jeremykendall/php-domain-parser" }, { "type": "vcs", "url": "https://github.com/jeremykendall/phpctagger" } ], "require": { "jeremykendall/php-domain-parser": ">=0.0.5", "jeremykendall/phpctagger": ">0.0.6" }, "archive": { "directory": "dist", "format": "tar" } } Saturday, November 2, 13
  • 151. Build Repo $ php bin/satis build config.json web/ Saturday, November 2, 13
  • 152. composer.json { "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" } } Saturday, November 2, 13
  • 153. composer.json { "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" } } Saturday, November 2, 13
  • 154. composer.json { "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" } } Saturday, November 2, 13
  • 155. Satis Demo Project Saturday, November 2, 13
  • 156. Satis Demo Project ‣ Saturday, November 2, 13 Want to goof around with Satis?
  • 157. Satis Demo Project ‣ See: https://github.com/jeremykendall/satis-demo ‣ Want to goof around with Satis? Saturday, November 2, 13
  • 158. Satis Demo Project ‣ See: https://github.com/jeremykendall/satis-demo ‣ Clone, follow instructions in README, and WIN ‣ Want to goof around with Satis? Saturday, November 2, 13
  • 159. Satis Demo Project ‣ See: https://github.com/jeremykendall/satis-demo ‣ Clone, follow instructions in README, and WIN ‣ Satis really is dead simple to set up ‣ Want to goof around with Satis? Saturday, November 2, 13
  • 160. Parting Tips and Tricks Saturday, November 2, 13
  • 161. composer install --no-dev --prefer-dist --optimize-autoloader Saturday, November 2, 13
  • 162. “example/package”: “2.3.x-dev#5aec89a” Saturday, November 2, 13
  • 163. Non-Composer and PEAR packages can be installed (see “repositories” key documentation) Saturday, November 2, 13
  • 164. archive key Saturday, November 2, 13
  • 165. http://getcomposer.org #composer on irc.freenode.org Saturday, November 2, 13
  • 166. There’s So Much More! Saturday, November 2, 13
  • 167. Credits Saturday, November 2, 13
  • 168. Credits ‣ Thanks to TechCamp for having me IMMA LET YOU FINISH, BUT RAFAEL DOHMS HAS THE BEST COMPOSER TALK OF ALL TIME. Saturday, November 2, 13
  • 169. Credits Saturday, November 2, 13
  • 170. Credits ‣ Saturday, November 2, 13 Thanks to Rafael Dohms, the Composer presenter
  • 171. Credits ‣ Thanks to TechCamp for having me ‣ Thanks to Rafael Dohms, the Composer presenter Saturday, November 2, 13
  • 172. Credits ‣ Thanks to TechCamp for having me ‣ Thanks to Jordi Boggiano, Nils Adermann, and the ‣ community for an amazing project (and all the Thanks to Rafael Dohms, the Composer presenter documentation I cribbed from) Saturday, November 2, 13
  • 173. Credits ‣ Thanks to TechCamp for having me ‣ Thanks to Jordi Boggiano, Nils Adermann, and the ‣ community for an amazing project (and all the Thanks to Rafael Dohms, the Composer presenter documentation I cribbed from) ‣ Saturday, November 2, 13 Thanks to our sponsors for help making this happen
  • 174. Credits ‣ Thanks to TechCamp for having me ‣ Thanks to Jordi Boggiano, Nils Adermann, and the ‣ community for an amazing project (and all the Thanks to Rafael Dohms, the Composer presenter documentation I cribbed from) ‣ Thanks to all of you for being here ‣ Thanks to our sponsors for help making this happen Saturday, November 2, 13
  • 175. Thanks! jeremy@jeremykendall.net http://about.me/jeremykendall @jeremykendall http://365.jeremykendall.net Saturday, November 2, 13