game changing dependency management
Post on 06-May-2015
1.362 Views
Preview:
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
top related