Game Changing Dependency Management
Upcoming SlideShare
Loading in...5
×
 

Game Changing Dependency Management

on

  • 693 views

 

Statistics

Views

Total Views
693
Views on SlideShare
678
Embed Views
15

Actions

Likes
3
Downloads
6
Comments
0

1 Embed 15

https://twitter.com 15

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Game Changing Dependency Management Game Changing Dependency Management Presentation Transcript

  • Composer Game Changing Dependency Management TechCamp Memphis 2013 Saturday, November 2, 13 Jeremy Kendall
  • Saturday, November 2, 13
  • I love to code Saturday, November 2, 13
  • I love to code I’m terribly forgetful Saturday, November 2, 13
  • I love to code I’m terribly forgetful I take pictures Saturday, November 2, 13
  • I love to code I’m terribly forgetful I take pictures I work at OpenSky Saturday, November 2, 13
  • Adding Dependencies is Easy Saturday, November 2, 13
  • Adding Dependencies is Easy ‣ Saturday, November 2, 13 Copy and Paste
  • Adding Dependencies is Easy ‣ DIY Solution ‣ Copy and Paste Saturday, November 2, 13
  • Adding Dependencies is Easy ‣ DIY Solution ‣ SVN Externals ‣ Copy and Paste Saturday, November 2, 13
  • Adding Dependencies is Easy ‣ DIY Solution ‣ SVN Externals ‣ Git Submodules ‣ Copy and Paste Saturday, November 2, 13
  • Managing them is Messy Saturday, November 2, 13
  • What is Composer? Saturday, November 2, 13
  • What is Composer? ‣ Saturday, November 2, 13 Dependency management tool
  • What is Composer? ‣ Per-project ‣ Dependency management tool Saturday, November 2, 13
  • What is Composer? ‣ Per-project ‣ Inspired by: ‣ Dependency management tool Saturday, November 2, 13
  • What is Composer? ‣ Per-project ‣ Inspired by: ‣ node’s npm ‣ Dependency management tool Saturday, November 2, 13
  • What is Composer? ‣ Per-project ‣ Inspired by: ‣ node’s npm ‣ ruby’s bundler ‣ Dependency management tool Saturday, November 2, 13
  • Benefits Saturday, November 2, 13
  • Benefits ‣ Saturday, November 2, 13 Easily declare project dependencies
  • Benefits ‣ Updating dependency versions extremely simple ‣ Easily declare project dependencies Saturday, November 2, 13
  • Benefits ‣ Updating dependency versions extremely simple ‣ Ensures your team is on the same page ‣ Easily declare project dependencies Saturday, November 2, 13
  • 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
  • Installing Saturday, November 2, 13
  • Installing Locally In your project: Saturday, November 2, 13 $ curl -sS https://getcomposer.org/installer | php
  • 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
  • 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
  • Installing Globally Recommended $ curl -sS https://getcomposer.org/installer | php $ mv composer.phar /usr/local/bin/composer Saturday, November 2, 13
  • 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
  • (There’s an installer for Windows folks) Saturday, November 2, 13
  • 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
  • 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
  • Defining Dependencies Saturday, November 2, 13
  • composer.json { "require": { "monolog/monolog": "1.6.*" } } Saturday, November 2, 13
  • composer.json { "require": { "monolog/monolog": "1.6.*" } } ‣Place in the root of your project Saturday, November 2, 13
  • composer.json { "require": { "monolog/monolog": "1.6.*" } } ‣Place in the root of your project ‣“require” specifies package and version Saturday, November 2, 13
  • 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
  • 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
  • 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
  • Versions Saturday, November 2, 13
  • Versions ‣ Saturday, November 2, 13 Exact version: 1.0.0, 12.2.4, etc.
  • Versions ‣ Wildcard: 3.*, 4.2.* ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  • Versions ‣ Wildcard: 3.*, 4.2.* ‣ Range: >, >=, <=, != ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  • Versions ‣ Wildcard: 3.*, 4.2.* ‣ Range: >, >=, <=, != ‣ Example: >=2.4 ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  • 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
  • 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
  • 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))
  • composer.lock Saturday, November 2, 13
  • composer.lock ‣ Saturday, November 2, 13 install writes a dependency lock file
  • composer.lock ‣ List of exact versions installed ‣ install writes a dependency lock file Saturday, November 2, 13
  • composer.lock ‣ List of exact versions installed ‣ Commit both composer.lock and composer.json ‣ install writes a dependency lock file Saturday, November 2, 13
  • 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
  • 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
  • Updating Dependencies Saturday, November 2, 13
  • Updating Dependencies { "require": { "monolog/monolog": "1.6.*@dev" } } Saturday, November 2, 13
  • Updating Dependencies { "require": { "monolog/monolog": "1.6.*@dev" } } ‣Updates monolog library version Saturday, November 2, 13
  • Updating Dependencies { "require": { "monolog/monolog": "1.6.*@dev" } } ‣Updates monolog library version ‣Version >= 1.6.0 and < 1.7 (dev) Saturday, November 2, 13
  • 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
  • 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
  • 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
  • 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
  • Adding New Dependencies Edit composer.json . . . { "require": { "monolog/monolog": "1.6.*@dev", "ircmaxell/password-compat": "1.0.3" } } Saturday, November 2, 13
  • 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
  • Autoloading Saturday, November 2, 13
  • Autoloading ‣ Saturday, November 2, 13 Composer generates vendor/autoload.php
  • Autoloading ‣ Add require ‘vendor/autoload.php’; ‣ Composer generates vendor/autoload.php Saturday, November 2, 13
  • Autoloading ‣ Add require ‘vendor/autoload.php’; ‣ Immediately begin using your dependencies ‣ Composer generates vendor/autoload.php Saturday, November 2, 13
  • Autoloading Don’t forget to add your own code! { "require": { "monolog/monolog": "1.6.*@dev" }, "autoload": { "psr-0": { "Beeblebrox": "src/" } } } Saturday, November 2, 13
  • Autoloading Pro Tip Grab an autoloader instance and add more namespaces. $loader = require 'vendor/autoload.php'; $loader->add('AcmeTest', __DIR__); Saturday, November 2, 13
  • 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
  • Little Bobby Tables as a Service composer create-project jeremykendall/lbtaas lbtaas Saturday, November 2, 13
  • 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
  • Your Very Own Library Saturday, November 2, 13
  • Libraries Saturday, November 2, 13
  • Libraries ‣ Saturday, November 2, 13 Everyone has written a library of some sort
  • Libraries ‣ Making up examples is not my strong suit ‣ Everyone has written a library of some sort Saturday, November 2, 13
  • 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
  • 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
  • PHP Domain Parser https://github.com/jeremykendall/php-domain-parser Saturday, November 2, 13
  • { } 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" ] }
  • { "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
  • { "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
  • { "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
  • { "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
  • { "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
  • { "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
  • Now for the cool(er) stuff . . . Saturday, November 2, 13
  • { } 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
  • require-dev Saturday, November 2, 13
  • require-dev ‣ Saturday, November 2, 13 Lists packages required for development (think tests)
  • require-dev ‣ Only applies to the root package ‣ Lists packages required for development (think tests) Saturday, November 2, 13
  • 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
  • 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
  • { "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" ] }
  • bin Saturday, November 2, 13
  • bin ‣ Saturday, November 2, 13 cli scripts to pass along to package users
  • bin ‣ A set of files that should be treated as binaries ‣ cli scripts to pass along to package users Saturday, November 2, 13
  • 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
  • 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
  • { } 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
  • scripts Saturday, November 2, 13
  • scripts ‣ Saturday, November 2, 13 Used to execute custom code during the Composer execution process
  • scripts ‣ ‣ Saturday, November 2, 13 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 ‣ . . . or any command-line executable command ‣ PHP callback (defined as a static method) . . . Saturday, November 2, 13
  • 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
  • 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
  • scripts Saturday, November 2, 13
  • scripts ‣ Saturday, November 2, 13 Composer fires “named events” during execution
  • scripts ‣ Named events include: ‣ Composer fires “named events” during execution Saturday, November 2, 13
  • scripts ‣ Named events include: ‣ pre- and post-install-cmd ‣ Composer fires “named events” during execution Saturday, November 2, 13
  • scripts ‣ Named events include: ‣ pre- and post-install-cmd ‣ pre- and post-update-cmd ‣ Composer fires “named events” during execution Saturday, November 2, 13
  • 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
  • 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
  • Running scripts Saturday, November 2, 13
  • Running scripts Execute Composer (script will execute if the named event is triggered) or . . . Saturday, November 2, 13
  • Running scripts Execute Composer (script will execute if the named event is triggered) or . . . Saturday, November 2, 13
  • Running scripts Execute Composer (script will execute if the named event is triggered) or . . . composer run-script <named event> Saturday, November 2, 13
  • 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
  • You’ve built your library. Now what? Saturday, November 2, 13
  • Push it to a VCS Saturday, November 2, 13
  • Push it to a VCS ‣ Saturday, November 2, 13 git, svn, or hg all work equally well
  • 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
  • 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
  • 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
  • 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
  • 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
  • Share! Saturday, November 2, 13
  • Packagist Saturday, November 2, 13
  • Packagist Saturday, November 2, 13
  • Packagist ‣ Saturday, November 2, 13 The main package repository for Composer
  • Packagist ‣ (Aside: Search Packagist before “rolling your own”) ‣ The main package repository for Composer Saturday, November 2, 13
  • 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
  • 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
  • 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
  • Packagist Saturday, November 2, 13
  • Packagist: Package Search Saturday, November 2, 13
  • Packagist: Keyword Search Saturday, November 2, 13
  • Packagist: Package Saturday, November 2, 13
  • But what about internal proprietary packages? Saturday, November 2, 13
  • Satis to the Rescue Saturday, November 2, 13
  • Satis to the Rescue ‣ Saturday, November 2, 13 Static composer repository generator
  • Satis to the Rescue ‣ Lightweight, static file based version of Packagist ‣ Static composer repository generator Saturday, November 2, 13
  • Satis to the Rescue ‣ Lightweight, static file based version of Packagist ‣ Simple to configure ‣ Static composer repository generator Saturday, November 2, 13
  • Satis to the Rescue ‣ Lightweight, static file based version of Packagist ‣ Simple to configure ‣ Flexible ‣ Static composer repository generator Saturday, November 2, 13
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • Build Repo $ php bin/satis build config.json web/ Saturday, November 2, 13
  • composer.json { "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" } } Saturday, November 2, 13
  • composer.json { "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" } } Saturday, November 2, 13
  • composer.json { "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" } } Saturday, November 2, 13
  • Satis Demo Project Saturday, November 2, 13
  • Satis Demo Project ‣ Saturday, November 2, 13 Want to goof around with Satis?
  • Satis Demo Project ‣ See: https://github.com/jeremykendall/satis-demo ‣ Want to goof around with Satis? Saturday, November 2, 13
  • 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
  • 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
  • Parting Tips and Tricks Saturday, November 2, 13
  • composer install --no-dev --prefer-dist --optimize-autoloader Saturday, November 2, 13
  • “example/package”: “2.3.x-dev#5aec89a” Saturday, November 2, 13
  • Non-Composer and PEAR packages can be installed (see “repositories” key documentation) Saturday, November 2, 13
  • archive key Saturday, November 2, 13
  • http://getcomposer.org #composer on irc.freenode.org Saturday, November 2, 13
  • There’s So Much More! Saturday, November 2, 13
  • Credits Saturday, November 2, 13
  • 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
  • Credits Saturday, November 2, 13
  • Credits ‣ Saturday, November 2, 13 Thanks to Rafael Dohms, the Composer presenter
  • Credits ‣ Thanks to TechCamp for having me ‣ Thanks to Rafael Dohms, the Composer presenter Saturday, November 2, 13
  • 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
  • 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
  • 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
  • Thanks! jeremy@jeremykendall.net http://about.me/jeremykendall @jeremykendall http://365.jeremykendall.net Saturday, November 2, 13