Composer
Game Changing Dependency Management
php[architect] DevOps Summit Series Jeremy Kendall
I love to code
I love to code
I’m terribly forgetful
I love to code
I’m terribly forgetful
I take pictures
I love to code
I’m terribly forgetful
I take pictures
I work at OpenSky
Adding Dependencies is Easy
Adding Dependencies is Easy
‣ Copy and Paste
Adding Dependencies is Easy
‣ Copy and Paste
‣ DIY Solution
Adding Dependencies is Easy
‣ Copy and Paste
‣ DIY Solution
‣ SVN Externals
Adding Dependencies is Easy
‣ Copy and Paste
‣ DIY Solution
‣ SVN Externals
‣ Git Submodules
Managing them is Messy
What is Composer?
What is Composer?
‣ Dependency management tool
What is Composer?
‣ Dependency management tool
‣ Per-project
What is Composer?
‣ Dependency management tool
‣ Per-project
‣ Inspired by:
What is Composer?
‣ Dependency management tool
‣ Per-project
‣ Inspired by:
‣ node’s npm
What is Composer?
‣ Dependency management tool
‣ Per-project
‣ Inspired by:
‣ node’s npm
‣ ruby’s bundler
Benefits
Benefits
‣ Easily declare project dependencies
Benefits
‣ Easily declare project dependencies
‣ Updating dependency versions extremely simple
Benefits
‣ Easily declare project dependencies
‣ Updating dependency versions extremely simple
‣ Ensures your team is on th...
Benefits
‣ Easily declare project dependencies
‣ Updating dependency versions extremely simple
‣ Ensures your team is on th...
Installing
Installing Locally
$ curl -sS https://getcomposer.org/installer | phpIn your project:
Installing Locally
$ curl -sS https://getcomposer.org/installer | phpIn your project:
$ curl -sS https://getcomposer.org/i...
Installing Locally
$ curl -sS https://getcomposer.org/installer | phpIn your project:
$ curl -sS https://getcomposer.org/i...
Installing Globally
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
Recommen...
Installing Globally
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
(You mig...
(There’s an installer for
Windows folks)
Keeping up to Date
$ composer self-update
You are using the latest composer version.
$ php composer.phar self-update
You a...
Keeping up to Date
$ composer self-update
You are using the latest composer version.
(Always updates to the latest dev-mas...
Defining Dependencies
composer.json
{
"require": {
"monolog/monolog": "1.5.*"
}
}
composer.json
{
"require": {
"monolog/monolog": "1.5.*"
}
}
‣Place in the root of your project
composer.json
{
"require": {
"monolog/monolog": "1.5.*"
}
}
‣Place in the root of your project
‣“require” specifies package...
composer.json
{
"require": {
"monolog/monolog": "1.5.*"
}
}
‣Place in the root of your project
‣“require” specifies package...
composer.json
{
"require": {
"monolog/monolog": "1.5.*"
}
}
‣Place in the root of your project
‣“require” specifies package...
composer.json
{
"require": {
"monolog/monolog": "1.5.*"
}
}
‣Place in the root of your project
‣“require” specifies package...
Versions
‣ Exact version: 1.0.0, 12.2.4, etc.
Versions
‣ Exact version: 1.0.0, 12.2.4, etc.
‣ Wildcard: 3.*, 4.2.*
Versions
‣ Exact version: 1.0.0, 12.2.4, etc.
‣ Wildcard: 3.*, 4.2.*
‣ Range: >, >=, <=, !=
Versions
‣ Exact version: 1.0.0, 12.2.4, etc.
‣ Wildcard: 3.*, 4.2.*
‣ Range: >, >=, <=, !=
‣ Example: >=2.4
Versions
‣ Exact version: 1.0.0, 12.2.4, etc.
‣ Wildcard: 3.*, 4.2.*
‣ Range: >, >=, <=, !=
‣ Example: >=2.4
‣ Range: >=1.0,<1.7 (c...
‣ Exact version: 1.0.0, 12.2.4, etc.
‣ Wildcard: 3.*, 4.2.*
‣ Range: >, >=, <=, !=
‣ Example: >=2.4
‣ Range: >=1.0,<1.7 (c...
Installing Dependencies
$ composer install
Loading composer repositories with package information
Installing dependencies ...
composer.lock
composer.lock
‣ install writes a dependency lock file
composer.lock
‣ install writes a dependency lock file
‣ List of exact versions installed
composer.lock
‣ install writes a dependency lock file
‣ List of exact versions installed
‣ Commit both composer.lock and co...
composer.lock
‣ install writes a dependency lock file
‣ List of exact versions installed
‣ Commit both composer.lock and co...
composer.lock
‣ install writes a dependency lock file
‣ List of exact versions installed
‣ Commit both composer.lock and co...
Updating Dependencies
Updating Dependencies
{
"require": {
"monolog/monolog": "1.6.*@dev"
}
}
Updating Dependencies
{
"require": {
"monolog/monolog": "1.6.*@dev"
}
}
‣Updates monolog library version
Updating Dependencies
{
"require": {
"monolog/monolog": "1.6.*@dev"
}
}
‣Updates monolog library version
‣Version >= 1.6.0...
Updating Dependencies
$ composer update
Loading composer repositories with package information
Updating dependencies (incl...
Updating Dependencies
$ composer update
Loading composer repositories with package information
Updating dependencies (incl...
Updating Dependencies
$ composer update
Loading composer repositories with package information
Updating dependencies (incl...
Updating Dependencies
$ composer update
Loading composer repositories with package information
Updating dependencies (incl...
Adding New Dependencies
Edit composer.json . . .
{
"require": {
"monolog/monolog": "1.6.*@dev",
"ircmaxell/password-compat...
Adding New Dependencies
Or use the command line
$ composer require ircmaxell/password-compat:1.0.3
composer.json has been ...
Autoloading
Autoloading
‣ Composer generates vendor/autoload.php
Autoloading
‣ Composer generates vendor/autoload.php
‣ Add require ‘vendor/autoload.php’;
Autoloading
‣ Composer generates vendor/autoload.php
‣ Add require ‘vendor/autoload.php’;
‣ Immediately begin using your d...
Autoloading
{
"require": {
"monolog/monolog": "1.6.*@dev"
},
"autoload": {
"psr-0": {
"Beeblebrox": "src/"
}
}
}
Don’t for...
Autoloading
$loader = require 'vendor/autoload.php';
$loader->add('AcmeTest', __DIR__);
Pro Tip
Grab an autoloader instanc...
Kickstart a Project
$ composer create-project slim/slim-skeleton super-sweet-application
Installing slim/slim-skeleton (1....
YourVery Own Library
Libraries
Libraries
‣ Everyone has written a library of some sort
Libraries
‣ Everyone has written a library of some sort
‣ Making up examples is not my strong suit
Libraries
‣ Everyone has written a library of some sort
‣ Making up examples is not my strong suit
‣ Let’s walk through a ...
Libraries
‣ Everyone has written a library of some sort
‣ Making up examples is not my strong suit
‣ Let’s walk through a ...
PHP Domain Parser
https://github.com/jeremykendall/php-domain-parser
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
Now for the cool(er)
stuff . . .
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
require-dev
require-dev
‣ Lists packages required for development (think tests)
require-dev
‣ Lists packages required for development (think tests)
‣ Only applies to the root package
require-dev
‣ Lists packages required for development (think tests)
‣ Only applies to the root package
‣ Both install and ...
require-dev
‣ Lists packages required for development (think tests)
‣ Only applies to the root package
‣ Both install and ...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
bin
bin
‣ cli scripts to pass along to package users
bin
‣ cli scripts to pass along to package users
‣ A set of files that should be treated as binaries
bin
‣ cli scripts to pass along to package users
‣ A set of files that should be treated as binaries
‣ Installs binaries to...
bin
‣ cli scripts to pass along to package users
‣ A set of files that should be treated as binaries
‣ Installs binaries to...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
scripts
scripts
‣ Used to execute custom code during the Composer
execution process
scripts
‣ Used to execute custom code during the Composer
execution process
‣ PHP callback (defined as a static method) . ....
scripts
‣ Used to execute custom code during the Composer
execution process
‣ PHP callback (defined as a static method) . ....
scripts
‣ Used to execute custom code during the Composer
execution process
‣ PHP callback (defined as a static method) . ....
scripts
‣ Used to execute custom code during the Composer
execution process
‣ PHP callback (defined as a static method) . ....
scripts
scripts
‣ Composer fires “named events” during execution
scripts
‣ Composer fires “named events” during execution
‣ Named events include:
scripts
‣ Composer fires “named events” during execution
‣ Named events include:
‣ pre- and post-install-cmd
scripts
‣ Composer fires “named events” during execution
‣ Named events include:
‣ pre- and post-install-cmd
‣ pre- and pos...
scripts
‣ Composer fires “named events” during execution
‣ Named events include:
‣ pre- and post-install-cmd
‣ pre- and pos...
scripts
‣ Composer fires “named events” during execution
‣ Named events include:
‣ pre- and post-install-cmd
‣ pre- and pos...
Running scripts
Running scripts
Execute Composer (script will execute if the named
event is triggered) or . . .
Running scripts
Execute Composer (script will execute if the named
event is triggered) or . . .
Running scripts
Execute Composer (script will execute if the named
event is triggered) or . . .
composer run-script <named...
Example
public static function create(Event $event)
{
$dir = dirname($event->getComposer()->getConfig()->get('vendor-dir')...
You’ve built your library.
Now what?
Push it to aVCS
Push it to aVCS
‣ git, svn, or hg all work equally well
Push it to aVCS
‣ git, svn, or hg all work equally well
‣ For the sake of simplicity I’ll assume git/github
Push it to aVCS
‣ git, svn, or hg all work equally well
‣ For the sake of simplicity I’ll assume git/github
‣ Package vers...
Push it to aVCS
‣ git, svn, or hg all work equally well
‣ For the sake of simplicity I’ll assume git/github
‣ Package vers...
Push it to aVCS
‣ git, svn, or hg all work equally well
‣ For the sake of simplicity I’ll assume git/github
‣ Package vers...
Push it to aVCS
‣ git, svn, or hg all work equally well
‣ For the sake of simplicity I’ll assume git/github
‣ Package vers...
Share!
Packagist
Packagist
Packagist
‣ The main package repository for Composer
Packagist
‣ The main package repository for Composer
‣ (Aside: Search Packagist before “rolling your own”)
Packagist
‣ The main package repository for Composer
‣ (Aside: Search Packagist before “rolling your own”)
‣ Packages publ...
Packagist
‣ The main package repository for Composer
‣ (Aside: Search Packagist before “rolling your own”)
‣ Packages publ...
Packagist
‣ The main package repository for Composer
‣ (Aside: Search Packagist before “rolling your own”)
‣ Packages publ...
Packagist
Packagist: Package Search
Packagist: Keyword Search
Packagist: Package
But what about internal
proprietary packages?
Satis to the Rescue
Satis to the Rescue
‣ Static composer repository generator
Satis to the Rescue
‣ Static composer repository generator
‣ Lightweight, static file based version of Packagist
Satis to the Rescue
‣ Static composer repository generator
‣ Lightweight, static file based version of Packagist
‣ Simple t...
Satis to the Rescue
‣ Static composer repository generator
‣ Lightweight, static file based version of Packagist
‣ Simple t...
$ composer create-project composer/satis --stability=dev --keep-vcs
Installing composer/satis (dev-master 059588ef0fd09779...
Satis config.json
{
"name": "Satis Demo",
"homepage": "http://satis.dev",
"repositories": [
{ "type": "vcs", "url": "https:...
Satis config.json
{
"name": "Satis Demo",
"homepage": "http://satis.dev",
"repositories": [
{ "type": "vcs", "url": "https:...
Satis config.json
{
"name": "Satis Demo",
"homepage": "http://satis.dev",
"repositories": [
{ "type": "vcs", "url": "https:...
Satis config.json
{
"name": "Satis Demo",
"homepage": "http://satis.dev",
"repositories": [
{ "type": "vcs", "url": "https:...
Satis config.json
{
"name": "Satis Demo",
"homepage": "http://satis.dev",
"repositories": [
{ "type": "vcs", "url": "https:...
Build Repo
$ php bin/satis build config.json web/
composer.json
{
"repositories": [
{ "type": "composer", "url": "http://satis.dev" }
],
"require": {
"jeremykendall/php-dom...
composer.json
{
"repositories": [
{ "type": "composer", "url": "http://satis.dev" }
],
"require": {
"jeremykendall/php-dom...
composer.json
{
"repositories": [
{ "type": "composer", "url": "http://satis.dev" }
],
"require": {
"jeremykendall/php-dom...
Satis Demo Project
Satis Demo Project
‣ Want to goof around with Satis?
Satis Demo Project
‣ Want to goof around with Satis?
‣ See: https://github.com/jeremykendall/satis-demo
Satis Demo Project
‣ Want to goof around with Satis?
‣ See: https://github.com/jeremykendall/satis-demo
‣ Clone, follow in...
Satis Demo Project
‣ Want to goof around with Satis?
‣ See: https://github.com/jeremykendall/satis-demo
‣ Clone, follow in...
Parting Tips and Tricks
composer install --no-dev --prefer-dist --optimize-autoloader
“example/package”: “2.3.x-dev#5aec89a”
Non-Composer and PEAR packages can be installed
(see “repositories” key documentation)
http://getcomposer.org
#composer on irc.freenode.org
There’s So Much More!
Credits
Credits
‣ Thanks to php[architect] for having me
IMMA LET YOU FINISH,
BUT RAFAEL DOHMS
HAS THE BEST
COMPOSER TALK OF
ALL T...
Credits
Credits
‣ Thanks to Rafael Dohms, the Composer presenter
Credits
‣ Thanks to Rafael Dohms, the Composer presenter
‣ Thanks to php[architect] for having me
Credits
‣ Thanks to Rafael Dohms, the Composer presenter
‣ Thanks to php[architect] for having me
‣ Thanks to Jordi Boggia...
Credits
‣ Thanks to Rafael Dohms, the Composer presenter
‣ Thanks to php[architect] for having me
‣ Thanks to Jordi Boggia...
Credits
‣ Thanks to Rafael Dohms, the Composer presenter
‣ Thanks to php[architect] for having me
‣ Thanks to Jordi Boggia...
Thanks!
jeremy@jeremykendall.net
http://about.me/jeremykendall
@jeremykendall
https://joind.in/8968
Composer: Game Changing Dependency Management
Upcoming SlideShare
Loading in...5
×

Composer: Game Changing Dependency Management

2,265

Published on

Managing dependencies and third-party code in PHP applications is a daily challenge, keeping everyone on the same versions during development and at deploy time a struggle. Meet Composer, a tool designed to help you maintain a consistent set of dependencies as well as share and discover new libraries. Let’s see how you can use this tool in your Applications and Libraries to wrangle your dependencies with a simple json configuration file and a command line interface.

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

No Downloads
Views
Total Views
2,265
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
13
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Composer: Game Changing Dependency Management

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

    Clipping is a handy way to collect important slides you want to go back to later.

×