Game Changing Dependency Management

Post on 06-May-2015

1,355 views 3 download

transcript

ComposerGame Changing Dependency Management

TechCamp Memphis 2013 Jeremy Kendall

Saturday, November 2, 13

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

‣ Copy and Paste

Saturday, November 2, 13

Adding Dependencies is Easy

‣ Copy and Paste

‣ DIY Solution

Saturday, November 2, 13

Adding Dependencies is Easy

‣ Copy and Paste

‣ DIY Solution

‣ SVN Externals

Saturday, November 2, 13

Adding Dependencies is Easy

‣ Copy and Paste

‣ DIY Solution

‣ SVN Externals

‣ Git Submodules

Saturday, November 2, 13

Managing them is Messy

Saturday, November 2, 13

What is Composer?

Saturday, November 2, 13

What is Composer?

‣ Dependency management tool

Saturday, November 2, 13

What is Composer?

‣ Dependency management tool

‣ Per-project

Saturday, November 2, 13

What is Composer?

‣ Dependency management tool

‣ Per-project

‣ Inspired by:

Saturday, November 2, 13

What is Composer?

‣ Dependency management tool

‣ Per-project

‣ Inspired by:

‣ node’s npm

Saturday, November 2, 13

What is Composer?

‣ Dependency management tool

‣ Per-project

‣ Inspired by:

‣ node’s npm

‣ ruby’s bundler

Saturday, November 2, 13

Benefits

Saturday, November 2, 13

Benefits

‣ Easily declare project dependencies

Saturday, November 2, 13

Benefits

‣ Easily declare project dependencies

‣ Updating dependency versions extremely simple

Saturday, November 2, 13

Benefits

‣ Easily declare project dependencies

‣ Updating dependency versions extremely simple

‣ Ensures your team is on the same page

Saturday, November 2, 13

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

Installing

Saturday, November 2, 13

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

Saturday, November 2, 13

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

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

Installing Globally

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

Recommended

Saturday, November 2, 13

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

(There’s an installer for Windows folks)

Saturday, November 2, 13

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

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

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

‣ Exact version: 1.0.0, 12.2.4, etc.

Versions

Saturday, November 2, 13

‣ Exact version: 1.0.0, 12.2.4, etc.

‣Wildcard: 3.*, 4.2.*

Versions

Saturday, November 2, 13

‣ Exact version: 1.0.0, 12.2.4, etc.

‣Wildcard: 3.*, 4.2.*

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

Versions

Saturday, November 2, 13

‣ Exact version: 1.0.0, 12.2.4, etc.

‣Wildcard: 3.*, 4.2.*

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

‣ Example: >=2.4

Versions

Saturday, November 2, 13

‣ 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

‣ 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

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

composer.lock

Saturday, November 2, 13

composer.lock

‣ install writes a dependency lock file

Saturday, November 2, 13

composer.lock

‣ install writes a dependency lock file

‣ List of exact versions installed

Saturday, November 2, 13

composer.lock

‣ install writes a dependency lock file

‣ List of exact versions installed

‣ Commit both composer.lock and composer.json

Saturday, November 2, 13

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

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

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

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

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

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

Adding New Dependencies

Edit composer.json . . .

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

}}

Saturday, November 2, 13

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

Autoloading

Saturday, November 2, 13

Autoloading

‣ Composer generates vendor/autoload.php

Saturday, November 2, 13

Autoloading

‣ Composer generates vendor/autoload.php

‣ Add require ‘vendor/autoload.php’;

Saturday, November 2, 13

Autoloading

‣ Composer generates vendor/autoload.php

‣ Add require ‘vendor/autoload.php’;

‣ Immediately begin using your dependencies

Saturday, November 2, 13

Autoloading

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

Don’t forget to add your own code!

Saturday, November 2, 13

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

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

Little Bobby Tables as a Service

composer create-project jeremykendall/lbtaas lbtaas

Saturday, November 2, 13

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

Your Very Own Library

Saturday, November 2, 13

Libraries

Saturday, November 2, 13

Libraries

‣ Everyone has written a library of some sort

Saturday, November 2, 13

Libraries

‣ Everyone has written a library of some sort

‣ Making up examples is not my strong suit

Saturday, November 2, 13

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

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

PHP Domain Parser

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

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

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

Package requirements

Autoloading

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

Add the “name” keyand 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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::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": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ], "post-update-cmd": [ "PhpCtagger\\Composer\\Script\\Ctagger::ctag" ] }}

Full fledged library!

Saturday, November 2, 13

Now for the cool(er) stuff . . .

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

require-dev

Saturday, November 2, 13

require-dev

Saturday, November 2, 13

require-dev

‣ Lists packages required for development (think tests)

Saturday, November 2, 13

require-dev

‣ Lists packages required for development (think tests)

‣ Only applies to the root package

Saturday, November 2, 13

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

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

{ "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

bin

Saturday, November 2, 13

bin

‣ cli scripts to pass along to package users

Saturday, November 2, 13

bin

‣ cli scripts to pass along to package users

‣ A set of files that should be treated as binaries

Saturday, November 2, 13

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

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

{ "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

scripts

Saturday, November 2, 13

scripts

‣ Used to execute custom code during the Composer execution process

Saturday, November 2, 13

scripts

‣ Used to execute custom code during the Composer execution process

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

Saturday, November 2, 13

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

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

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

scripts

Saturday, November 2, 13

scripts

‣ Composer fires “named events” during execution

Saturday, November 2, 13

scripts

‣ Composer fires “named events” during execution

‣ Named events include:

Saturday, November 2, 13

scripts

‣ Composer fires “named events” during execution

‣ Named events include:

‣ pre- and post-install-cmd

Saturday, November 2, 13

scripts

‣ Composer fires “named events” during execution

‣ Named events include:

‣ pre- and post-install-cmd

‣ pre- and post-update-cmd

Saturday, November 2, 13

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

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

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‣ git, svn, or hg all work equally well

Saturday, November 2, 13

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

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

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

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

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

Share!

Saturday, November 2, 13

Packagist

Saturday, November 2, 13

Packagist

Saturday, November 2, 13

Packagist

‣ The main package repository for Composer

Saturday, November 2, 13

Packagist

‣ The main package repository for Composer

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

Saturday, November 2, 13

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

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

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

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

‣ Static composer repository generator

Saturday, November 2, 13

Satis to the Rescue

‣ Static composer repository generator

‣ Lightweight, static file based version of Packagist

Saturday, November 2, 13

Satis to the Rescue

‣ Static composer repository generator

‣ Lightweight, static file based version of Packagist

‣ Simple to configure

Saturday, November 2, 13

Satis to the Rescue

‣ Static composer repository generator

‣ Lightweight, static file based version of Packagist

‣ Simple to configure

‣ Flexible

Saturday, November 2, 13

$ 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

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

‣Want to goof around with Satis?

Saturday, November 2, 13

Satis Demo Project

‣Want to goof around with Satis?

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

Saturday, November 2, 13

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

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

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

‣ Thanks to Rafael Dohms, the Composer presenter

Saturday, November 2, 13

Credits

‣ Thanks to Rafael Dohms, the Composer presenter

‣ Thanks to TechCamp for having me

Saturday, November 2, 13

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

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

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

Thanks!

jeremy@jeremykendall.net

http://about.me/jeremykendall

@jeremykendall

http://365.jeremykendall.net

Saturday, November 2, 13