+ All Categories
Home > Technology > Game Changing Dependency Management

Game Changing Dependency Management

Date post: 06-May-2015
Category:
Upload: jeremy-kendall
View: 1,355 times
Download: 3 times
Share this document with a friend
175
Composer Game Changing Dependency Management TechCamp Memphis 2013 Jeremy Kendall Saturday, November 2, 13
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


Recommended