Top Banner
Composer Game Changing Dependency Management TechCamp Memphis 2013 Jeremy Kendall Saturday, November 2, 13
175

Game Changing Dependency Management

May 06, 2015

Download

Technology

Jeremy Kendall
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Game Changing Dependency Management

ComposerGame Changing Dependency Management

TechCamp Memphis 2013 Jeremy Kendall

Saturday, November 2, 13

Page 2: Game Changing Dependency Management

Saturday, November 2, 13

Page 3: Game Changing Dependency Management

I love to code

Saturday, November 2, 13

Page 4: Game Changing Dependency Management

I love to code

I’m terribly forgetful

Saturday, November 2, 13

Page 5: Game Changing Dependency Management

I love to code

I’m terribly forgetful

I take pictures

Saturday, November 2, 13

Page 6: Game Changing Dependency Management

I love to code

I’m terribly forgetful

I take pictures

I work at OpenSky

Saturday, November 2, 13

Page 7: Game Changing Dependency Management

Adding Dependencies is Easy

Saturday, November 2, 13

Page 8: Game Changing Dependency Management

Adding Dependencies is Easy

‣ Copy and Paste

Saturday, November 2, 13

Page 9: Game Changing Dependency Management

Adding Dependencies is Easy

‣ Copy and Paste

‣ DIY Solution

Saturday, November 2, 13

Page 10: Game Changing Dependency Management

Adding Dependencies is Easy

‣ Copy and Paste

‣ DIY Solution

‣ SVN Externals

Saturday, November 2, 13

Page 11: Game Changing Dependency Management

Adding Dependencies is Easy

‣ Copy and Paste

‣ DIY Solution

‣ SVN Externals

‣ Git Submodules

Saturday, November 2, 13

Page 12: Game Changing Dependency Management

Managing them is Messy

Saturday, November 2, 13

Page 13: Game Changing Dependency Management

What is Composer?

Saturday, November 2, 13

Page 14: Game Changing Dependency Management

What is Composer?

‣ Dependency management tool

Saturday, November 2, 13

Page 15: Game Changing Dependency Management

What is Composer?

‣ Dependency management tool

‣ Per-project

Saturday, November 2, 13

Page 16: Game Changing Dependency Management

What is Composer?

‣ Dependency management tool

‣ Per-project

‣ Inspired by:

Saturday, November 2, 13

Page 17: Game Changing Dependency Management

What is Composer?

‣ Dependency management tool

‣ Per-project

‣ Inspired by:

‣ node’s npm

Saturday, November 2, 13

Page 18: Game Changing Dependency Management

What is Composer?

‣ Dependency management tool

‣ Per-project

‣ Inspired by:

‣ node’s npm

‣ ruby’s bundler

Saturday, November 2, 13

Page 19: Game Changing Dependency Management

Benefits

Saturday, November 2, 13

Page 20: Game Changing Dependency Management

Benefits

‣ Easily declare project dependencies

Saturday, November 2, 13

Page 21: Game Changing Dependency Management

Benefits

‣ Easily declare project dependencies

‣ Updating dependency versions extremely simple

Saturday, November 2, 13

Page 22: Game Changing Dependency Management

Benefits

‣ Easily declare project dependencies

‣ Updating dependency versions extremely simple

‣ Ensures your team is on the same page

Saturday, November 2, 13

Page 23: Game Changing Dependency Management

Benefits

‣ Easily declare project dependencies

‣ Updating dependency versions extremely simple

‣ Ensures your team is on the same page

‣ Tons of excellent related features

Saturday, November 2, 13

Page 24: Game Changing Dependency Management

Installing

Saturday, November 2, 13

Page 25: Game Changing Dependency Management

Installing Locally$ curl -sS https://getcomposer.org/installer | phpIn your project:

Saturday, November 2, 13

Page 26: Game Changing Dependency Management

Installing Locally$ curl -sS https://getcomposer.org/installer | phpIn your project:

$ curl -sS https://getcomposer.org/installer | php -- --install-dir=binSpecify a directory:

Saturday, November 2, 13

Page 27: Game Changing Dependency Management

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 phpAll settings correct for using ComposerDownloading...

Composer successfully installed to: /Users/jkendall/dev/composer.pharUse it: php composer.phar

What you’ll see:

Saturday, November 2, 13

Page 28: Game Changing Dependency Management

Installing Globally

$ curl -sS https://getcomposer.org/installer | php$ mv composer.phar /usr/local/bin/composer

Recommended

Saturday, November 2, 13

Page 29: Game Changing Dependency Management

Installing Globally

$ curl -sS https://getcomposer.org/installer | php$ mv composer.phar /usr/local/bin/composer

(You might need to use sudo)

Recommended

Saturday, November 2, 13

Page 30: Game Changing Dependency Management

(There’s an installer for Windows folks)

Saturday, November 2, 13

Page 31: Game Changing Dependency Management

Keeping up to Date

$ composer self-updateYou are using the latest composer version.

$ php composer.phar self-updateYou are using the latest composer version.

or

Saturday, November 2, 13

Page 32: Game Changing Dependency Management

Keeping up to Date

$ composer self-updateYou are using the latest composer version.

(Always updates to the latest dev-master)

$ php composer.phar self-updateYou are using the latest composer version.

or

Saturday, November 2, 13

Page 33: Game Changing Dependency Management

Defining Dependencies

Saturday, November 2, 13

Page 34: Game Changing Dependency Management

composer.json

{ "require": { "monolog/monolog": "1.6.*" }}

Saturday, November 2, 13

Page 35: Game Changing Dependency Management

composer.json

{ "require": { "monolog/monolog": "1.6.*" }}

‣Place in the root of your project

Saturday, November 2, 13

Page 36: Game Changing Dependency Management

composer.json

{ "require": { "monolog/monolog": "1.6.*" }}

‣Place in the root of your project‣“require” specifies package and version

Saturday, November 2, 13

Page 37: Game Changing Dependency Management

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

Page 38: Game Changing Dependency Management

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

Page 39: Game Changing Dependency Management

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

Page 40: Game Changing Dependency Management

Versions

Saturday, November 2, 13

Page 41: Game Changing Dependency Management

‣ Exact version: 1.0.0, 12.2.4, etc.

Versions

Saturday, November 2, 13

Page 42: Game Changing Dependency Management

‣ Exact version: 1.0.0, 12.2.4, etc.

‣Wildcard: 3.*, 4.2.*

Versions

Saturday, November 2, 13

Page 43: Game Changing Dependency Management

‣ Exact version: 1.0.0, 12.2.4, etc.

‣Wildcard: 3.*, 4.2.*

‣ Range: >, >=, <=, !=

Versions

Saturday, November 2, 13

Page 44: Game Changing Dependency Management

‣ Exact version: 1.0.0, 12.2.4, etc.

‣Wildcard: 3.*, 4.2.*

‣ Range: >, >=, <=, !=

‣ Example: >=2.4

Versions

Saturday, November 2, 13

Page 45: Game Changing Dependency Management

‣ 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

Saturday, November 2, 13

Page 46: Game Changing Dependency Management

‣ 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

Saturday, November 2, 13

Page 47: Game Changing Dependency Management

Installing Dependencies

$ composer installLoading composer repositories with package informationInstalling 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 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 fileGenerating autoload files

composer install

Saturday, November 2, 13

Page 48: Game Changing Dependency Management

composer.lock

Saturday, November 2, 13

Page 49: Game Changing Dependency Management

composer.lock

‣ install writes a dependency lock file

Saturday, November 2, 13

Page 50: Game Changing Dependency Management

composer.lock

‣ install writes a dependency lock file

‣ List of exact versions installed

Saturday, November 2, 13

Page 51: Game Changing Dependency Management

composer.lock

‣ install writes a dependency lock file

‣ List of exact versions installed

‣ Commit both composer.lock and composer.json

Saturday, November 2, 13

Page 52: Game Changing Dependency Management

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

Saturday, November 2, 13

Page 53: Game Changing Dependency Management

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

Saturday, November 2, 13

Page 54: Game Changing Dependency Management

Updating Dependencies

Saturday, November 2, 13

Page 55: Game Changing Dependency Management

Updating Dependencies

{ "require": { "monolog/monolog": "1.6.*@dev" }}

Saturday, November 2, 13

Page 56: Game Changing Dependency Management

Updating Dependencies

{ "require": { "monolog/monolog": "1.6.*@dev" }}

‣Updates monolog library version

Saturday, November 2, 13

Page 57: Game Changing Dependency Management

Updating Dependencies

{ "require": { "monolog/monolog": "1.6.*@dev" }}

‣Updates monolog library version‣Version >= 1.6.0 and < 1.7 (dev)

Saturday, November 2, 13

Page 58: Game Changing Dependency Management

Updating Dependencies

$ composer updateLoading composer repositories with package informationUpdating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7

Writing lock fileGenerating autoload files

composer update

Saturday, November 2, 13

Page 59: Game Changing Dependency Management

Updating Dependencies

$ composer updateLoading composer repositories with package informationUpdating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7

Writing lock fileGenerating autoload files

‣Reads from composer.json

composer update

Saturday, November 2, 13

Page 60: Game Changing Dependency Management

Updating Dependencies

$ composer updateLoading composer repositories with package informationUpdating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7

Writing lock fileGenerating autoload files

‣Reads from composer.json‣Updates dependencies

composer update

Saturday, November 2, 13

Page 61: Game Changing Dependency Management

Updating Dependencies

$ composer updateLoading composer repositories with package informationUpdating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7

Writing lock fileGenerating autoload files

‣Reads from composer.json‣Updates dependencies‣Rewrites lock file

composer update

Saturday, November 2, 13

Page 62: Game Changing Dependency Management

Adding New Dependencies

Edit composer.json . . .

{ "require": { "monolog/monolog": "1.6.*@dev", "ircmaxell/password-compat": "1.0.3"

}}

Saturday, November 2, 13

Page 63: Game Changing Dependency Management

Adding New DependenciesOr use the command line

$ composer require ircmaxell/password-compat:1.0.3composer.json has been updatedLoading composer repositories with package informationUpdating dependencies (including require-dev) - Installing ircmaxell/password-compat (1.0.3) Downloading: 100%

Writing lock fileGenerating autoload files

composer require

Saturday, November 2, 13

Page 64: Game Changing Dependency Management

Autoloading

Saturday, November 2, 13

Page 65: Game Changing Dependency Management

Autoloading

‣ Composer generates vendor/autoload.php

Saturday, November 2, 13

Page 66: Game Changing Dependency Management

Autoloading

‣ Composer generates vendor/autoload.php

‣ Add require ‘vendor/autoload.php’;

Saturday, November 2, 13

Page 67: Game Changing Dependency Management

Autoloading

‣ Composer generates vendor/autoload.php

‣ Add require ‘vendor/autoload.php’;

‣ Immediately begin using your dependencies

Saturday, November 2, 13

Page 68: Game Changing Dependency Management

Autoloading

{ "require": { "monolog/monolog": "1.6.*@dev" }, "autoload": { "psr-0": { "Beeblebrox\\": "src/" } }}

Don’t forget to add your own code!

Saturday, November 2, 13

Page 69: Game Changing Dependency Management

Autoloading

$loader = require 'vendor/autoload.php';$loader->add('Acme\\Test\\', __DIR__);

Pro Tip

Grab an autoloader instance and add more namespaces.

Saturday, November 2, 13

Page 70: Game Changing Dependency Management

Kickstart a Project

$ composer create-project slim/slim-skeleton super-sweet-applicationInstalling slim/slim-skeleton (1.1.0) - Installing slim/slim-skeleton (1.1.0) Downloading: 100%

Created project in super-sweet-applicationLoading composer repositories with package informationInstalling 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 fileGenerating autoload files

composer create-project

Saturday, November 2, 13

Page 71: Game Changing Dependency Management

Little Bobby Tables as a Service

composer create-project jeremykendall/lbtaas lbtaas

Saturday, November 2, 13

Page 72: Game Changing Dependency Management

Little Bobby Tables as a Servicehttp://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

Page 73: Game Changing Dependency Management

Your Very Own Library

Saturday, November 2, 13

Page 74: Game Changing Dependency Management

Libraries

Saturday, November 2, 13

Page 75: Game Changing Dependency Management

Libraries

‣ Everyone has written a library of some sort

Saturday, November 2, 13

Page 76: Game Changing Dependency Management

Libraries

‣ Everyone has written a library of some sort

‣ Making up examples is not my strong suit

Saturday, November 2, 13

Page 77: Game Changing Dependency Management

Libraries

‣ Everyone has written a library of some sort

‣ Making up examples is not my strong suit

‣ Let’s walk through a real library . . .

Saturday, November 2, 13

Page 78: Game Changing Dependency Management

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

Saturday, November 2, 13

Page 79: Game Changing Dependency Management

PHP Domain Parser

https://github.com/jeremykendall/php-domain-parser

Saturday, November 2, 13

Page 80: Game Changing Dependency Management

{ "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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

Saturday, November 2, 13

Page 81: Game Changing Dependency Management

{ "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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

Package requirements

Saturday, November 2, 13

Page 82: Game Changing Dependency Management

{ "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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

Package requirements

Autoloading

Saturday, November 2, 13

Page 83: Game Changing Dependency Management

{ "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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

Add the “name” keyand it’s installable

Saturday, November 2, 13

Page 84: Game Changing Dependency Management

{ "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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

Additional metadata

Saturday, November 2, 13

Page 85: Game Changing Dependency Management

{ "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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

Don’t forget the license!

Saturday, November 2, 13

Page 86: Game Changing Dependency Management

{ "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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

Full fledged library!

Saturday, November 2, 13

Page 87: Game Changing Dependency Management

Now for the cool(er) stuff . . .

Saturday, November 2, 13

Page 88: Game Changing Dependency Management

{ "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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

require-dev

Saturday, November 2, 13

Page 89: Game Changing Dependency Management

require-dev

Saturday, November 2, 13

Page 90: Game Changing Dependency Management

require-dev

‣ Lists packages required for development (think tests)

Saturday, November 2, 13

Page 91: Game Changing Dependency Management

require-dev

‣ Lists packages required for development (think tests)

‣ Only applies to the root package

Saturday, November 2, 13

Page 92: Game Changing Dependency Management

require-dev

‣ Lists packages required for development (think tests)

‣ Only applies to the root package

‣ Both install and update install require-dev by default

Saturday, November 2, 13

Page 93: Game Changing Dependency Management

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)

Saturday, November 2, 13

Page 94: Game Changing Dependency Management

{ "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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

bin

Saturday, November 2, 13

Page 95: Game Changing Dependency Management

bin

Saturday, November 2, 13

Page 96: Game Changing Dependency Management

bin

‣ cli scripts to pass along to package users

Saturday, November 2, 13

Page 97: Game Changing Dependency Management

bin

‣ cli scripts to pass along to package users

‣ A set of files that should be treated as binaries

Saturday, November 2, 13

Page 98: Game Changing Dependency Management

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

Saturday, November 2, 13

Page 99: Game Changing Dependency Management

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

Saturday, November 2, 13

Page 100: Game Changing Dependency Management

{ "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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

scripts

Saturday, November 2, 13

Page 101: Game Changing Dependency Management

scripts

Saturday, November 2, 13

Page 102: Game Changing Dependency Management

scripts

‣ Used to execute custom code during the Composer execution process

Saturday, November 2, 13

Page 103: Game Changing Dependency Management

scripts

‣ Used to execute custom code during the Composer execution process

‣ PHP callback (defined as a static method) . . .

Saturday, November 2, 13

Page 104: Game Changing Dependency Management

scripts

‣ Used to execute custom code during the Composer execution process

‣ PHP callback (defined as a static method) . . .

‣ . . . or any command-line executable command

Saturday, November 2, 13

Page 105: Game Changing Dependency Management

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

Saturday, November 2, 13

Page 106: Game Changing Dependency Management

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

Saturday, November 2, 13

Page 107: Game Changing Dependency Management

scripts

Saturday, November 2, 13

Page 108: Game Changing Dependency Management

scripts

‣ Composer fires “named events” during execution

Saturday, November 2, 13

Page 109: Game Changing Dependency Management

scripts

‣ Composer fires “named events” during execution

‣ Named events include:

Saturday, November 2, 13

Page 110: Game Changing Dependency Management

scripts

‣ Composer fires “named events” during execution

‣ Named events include:

‣ pre- and post-install-cmd

Saturday, November 2, 13

Page 111: Game Changing Dependency Management

scripts

‣ Composer fires “named events” during execution

‣ Named events include:

‣ pre- and post-install-cmd

‣ pre- and post-update-cmd

Saturday, November 2, 13

Page 112: Game Changing Dependency Management

scripts

‣ Composer fires “named events” during execution

‣ Named events include:

‣ pre- and post-install-cmd

‣ pre- and post-update-cmd

‣ post-root-package-install

Saturday, November 2, 13

Page 113: Game Changing Dependency Management

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 . . .

Saturday, November 2, 13

Page 114: Game Changing Dependency Management

Running scripts

Saturday, November 2, 13

Page 115: Game Changing Dependency Management

Running scripts

Execute Composer (script will execute if the named event is triggered) or . . .

Saturday, November 2, 13

Page 116: Game Changing Dependency Management

Running scripts

Execute Composer (script will execute if the named event is triggered) or . . .

Saturday, November 2, 13

Page 117: Game Changing Dependency Management

Running scripts

Execute Composer (script will execute if the named event is triggered) or . . .

composer run-script <named event>

Saturday, November 2, 13

Page 118: Game Changing Dependency Management

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

Page 119: Game Changing Dependency Management

You’ve built your library.Now what?

Saturday, November 2, 13

Page 120: Game Changing Dependency Management

Push it to a VCS

Saturday, November 2, 13

Page 121: Game Changing Dependency Management

Push it to a VCS‣ git, svn, or hg all work equally well

Saturday, November 2, 13

Page 122: Game Changing Dependency Management

Push it to a VCS‣ git, svn, or hg all work equally well

‣ For the sake of simplicity I’ll assume git/github

Saturday, November 2, 13

Page 123: Game Changing Dependency Management

Push it to a VCS‣ git, svn, or hg all work equally well

‣ For the sake of simplicity I’ll assume git/github

‣ Package versions:

Saturday, November 2, 13

Page 124: Game Changing Dependency Management

Push it to a VCS‣ 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)

Saturday, November 2, 13

Page 125: Game Changing Dependency Management

Push it to a VCS‣ 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)

Saturday, November 2, 13

Page 126: Game Changing Dependency Management

Push it to a VCS‣ 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

Saturday, November 2, 13

Page 127: Game Changing Dependency Management

Share!

Saturday, November 2, 13

Page 128: Game Changing Dependency Management

Packagist

Saturday, November 2, 13

Page 129: Game Changing Dependency Management

Packagist

Saturday, November 2, 13

Page 130: Game Changing Dependency Management

Packagist

‣ The main package repository for Composer

Saturday, November 2, 13

Page 131: Game Changing Dependency Management

Packagist

‣ The main package repository for Composer

‣ (Aside: Search Packagist before “rolling your own”)

Saturday, November 2, 13

Page 132: Game Changing Dependency Management

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)

Saturday, November 2, 13

Page 133: Game Changing Dependency Management

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

Saturday, November 2, 13

Page 134: Game Changing Dependency Management

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

Saturday, November 2, 13

Page 135: Game Changing Dependency Management

Packagist

Saturday, November 2, 13

Page 136: Game Changing Dependency Management

Packagist: Package Search

Saturday, November 2, 13

Page 137: Game Changing Dependency Management

Packagist: Keyword Search

Saturday, November 2, 13

Page 138: Game Changing Dependency Management

Packagist: Package

Saturday, November 2, 13

Page 139: Game Changing Dependency Management

But what about internal proprietary packages?

Saturday, November 2, 13

Page 140: Game Changing Dependency Management

Satis to the Rescue

Saturday, November 2, 13

Page 141: Game Changing Dependency Management

Satis to the Rescue

‣ Static composer repository generator

Saturday, November 2, 13

Page 142: Game Changing Dependency Management

Satis to the Rescue

‣ Static composer repository generator

‣ Lightweight, static file based version of Packagist

Saturday, November 2, 13

Page 143: Game Changing Dependency Management

Satis to the Rescue

‣ Static composer repository generator

‣ Lightweight, static file based version of Packagist

‣ Simple to configure

Saturday, November 2, 13

Page 144: Game Changing Dependency Management

Satis to the Rescue

‣ Static composer repository generator

‣ Lightweight, static file based version of Packagist

‣ Simple to configure

‣ Flexible

Saturday, November 2, 13

Page 145: Game Changing Dependency Management

$ composer create-project composer/satis --stability=dev --keep-vcsInstalling composer/satis (dev-master 059588ef0fd0977964ad13637e02012519686202) - Installing composer/satis (dev-master master) Cloning master

Created project in /Users/jkendall/dev/satisLoading composer repositories with package informationInstalling dependencies (including require-dev) from lock fileWarning: 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

Saturday, November 2, 13

Page 146: Game Changing Dependency Management

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

Page 147: Game Changing Dependency Management

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

Page 148: Game Changing Dependency Management

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

Page 149: Game Changing Dependency Management

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

Page 150: Game Changing Dependency Management

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

Page 151: Game Changing Dependency Management

Build Repo

$ php bin/satis build config.json web/

Saturday, November 2, 13

Page 152: Game Changing Dependency Management

composer.json

{ "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" }}

Saturday, November 2, 13

Page 153: Game Changing Dependency Management

composer.json

{ "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" }}

Saturday, November 2, 13

Page 154: Game Changing Dependency Management

composer.json

{ "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" }}

Saturday, November 2, 13

Page 155: Game Changing Dependency Management

Satis Demo Project

Saturday, November 2, 13

Page 156: Game Changing Dependency Management

Satis Demo Project

‣Want to goof around with Satis?

Saturday, November 2, 13

Page 157: Game Changing Dependency Management

Satis Demo Project

‣Want to goof around with Satis?

‣ See: https://github.com/jeremykendall/satis-demo

Saturday, November 2, 13

Page 158: Game Changing Dependency Management

Satis Demo Project

‣Want to goof around with Satis?

‣ See: https://github.com/jeremykendall/satis-demo

‣ Clone, follow instructions in README, and WIN

Saturday, November 2, 13

Page 159: Game Changing Dependency Management

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

Saturday, November 2, 13

Page 160: Game Changing Dependency Management

Parting Tips and Tricks

Saturday, November 2, 13

Page 161: Game Changing Dependency Management

composer install --no-dev --prefer-dist --optimize-autoloader

Saturday, November 2, 13

Page 162: Game Changing Dependency Management

“example/package”: “2.3.x-dev#5aec89a”

Saturday, November 2, 13

Page 163: Game Changing Dependency Management

Non-Composer and PEAR packages can be installed (see “repositories” key documentation)

Saturday, November 2, 13

Page 164: Game Changing Dependency Management

archive key

Saturday, November 2, 13

Page 165: Game Changing Dependency Management

http://getcomposer.org

#composer on irc.freenode.org

Saturday, November 2, 13

Page 166: Game Changing Dependency Management

There’s So Much More!

Saturday, November 2, 13

Page 167: Game Changing Dependency Management

Credits

Saturday, November 2, 13

Page 168: Game Changing Dependency Management

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

Page 169: Game Changing Dependency Management

Credits

Saturday, November 2, 13

Page 170: Game Changing Dependency Management

Credits

‣ Thanks to Rafael Dohms, the Composer presenter

Saturday, November 2, 13

Page 171: Game Changing Dependency Management

Credits

‣ Thanks to Rafael Dohms, the Composer presenter

‣ Thanks to TechCamp for having me

Saturday, November 2, 13

Page 172: Game Changing Dependency Management

Credits

‣ Thanks to Rafael Dohms, the Composer presenter

‣ Thanks to TechCamp for having me

‣ Thanks to Jordi Boggiano, Nils Adermann, and the community for an amazing project (and all the documentation I cribbed from)

Saturday, November 2, 13

Page 173: Game Changing Dependency Management

Credits

‣ Thanks to Rafael Dohms, the Composer presenter

‣ Thanks to TechCamp 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

Saturday, November 2, 13

Page 174: Game Changing Dependency Management

Credits

‣ Thanks to Rafael Dohms, the Composer presenter

‣ Thanks to TechCamp 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

Saturday, November 2, 13

Page 175: Game Changing Dependency Management

Thanks!

[email protected]

http://about.me/jeremykendall

@jeremykendall

http://365.jeremykendall.net

Saturday, November 2, 13