0
Composer
Game Changing Dependency Management

TechCamp Memphis 2013

Saturday, November 2, 13

Jeremy Kendall
Saturday, November 2, 13
I love to code

Saturday, November 2, 13
I love to code
I’m terribly forgetful

Saturday, November 2, 13
I love to code
I’m terribly forgetful
I take pictures

Saturday, November 2, 13
I love to code
I’m terribly forgetful
I take pictures
I work at OpenSky

Saturday, November 2, 13
Adding Dependencies is Easy

Saturday, November 2, 13
Adding Dependencies is Easy
‣

Saturday, November 2, 13

Copy and Paste
Adding Dependencies is Easy
‣
DIY Solution
‣

Copy and Paste

Saturday, November 2, 13
Adding Dependencies is Easy
‣
DIY Solution
‣
SVN Externals
‣

Copy and Paste

Saturday, November 2, 13
Adding Dependencies is Easy
‣
DIY Solution
‣
SVN Externals
‣
Git Submodules
‣
Copy and Paste

Saturday, November 2, 13
Managing them is Messy

Saturday, November 2, 13
What is Composer?

Saturday, November 2, 13
What is Composer?
‣

Saturday, November 2, 13

Dependency management tool
What is Composer?
‣
Per-project
‣

Dependency management tool

Saturday, November 2, 13
What is Composer?
‣
Per-project
‣
Inspired by:
‣

Dependency management tool

Saturday, November 2, 13
What is Composer?
‣
Per-project
‣
Inspired by:
‣
node’s npm
‣

Dependency management tool

Saturday, November 2, 13
What is Composer?
‣
Per-project
‣
Inspired by:
‣
node’s npm
‣
ruby’s bundler
‣

Dependency management tool

Saturday, Nove...
Benefits

Saturday, November 2, 13
Benefits
‣

Saturday, November 2, 13

Easily declare project dependencies
Benefits
‣
Updating dependency versions extremely simple
‣
Easily declare project dependencies

Saturday, November 2, 13
Benefits
‣
Updating dependency versions extremely simple
‣
Ensures your team is on the same page
‣
Easily declare project d...
Benefits
‣
Updating dependency versions extremely simple
‣
Ensures your team is on the same page
‣
Tons of excellent relate...
Installing

Saturday, November 2, 13
Installing Locally
In your project:

Saturday, November 2, 13

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

Specify a directory:

Saturday, November 2, 13

$ curl -sS https://getcomposer.org/in...
Installing Locally
In your project:

Specify a directory:

What you’ll see:

$ curl -sS https://getcomposer.org/installer ...
Installing Globally
Recommended
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/compo...
Installing Globally
Recommended
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/compo...
(There’s an installer for
Windows folks)

Saturday, November 2, 13
Keeping up to Date
$ php composer.phar self-update
You are using the latest composer version.

or
$ composer self-update
Y...
Keeping up to Date
$ php composer.phar self-update
You are using the latest composer version.

or
$ composer self-update
Y...
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 packag...
composer.json
{
"require": {
"monolog/monolog": "1.6.*"
}
}

‣Place in the root of your project
‣“require” specifies packag...
composer.json
{
"require": {
"monolog/monolog": "1.6.*"
}
}

‣Place in the root of your project
‣“require” specifies packag...
composer.json
{
"require": {
"monolog/monolog": "1.6.*"
}
}

‣Place in the root of your project
‣“require” specifies packag...
Versions

Saturday, November 2, 13
Versions
‣

Saturday, November 2, 13

Exact version: 1.0.0, 12.2.4, etc.
Versions
‣
Wildcard: 3.*, 4.2.*
‣

Exact version: 1.0.0, 12.2.4, etc.

Saturday, November 2, 13
Versions
‣
Wildcard: 3.*, 4.2.*
‣
Range: >, >=, <=, !=
‣

Exact version: 1.0.0, 12.2.4, etc.

Saturday, November 2, 13
Versions
‣
Wildcard: 3.*, 4.2.*
‣
Range: >, >=, <=, !=
‣
Example: >=2.4
‣

Exact version: 1.0.0, 12.2.4, etc.

Saturday, N...
Versions
‣
Wildcard: 3.*, 4.2.*
‣
Range: >, >=, <=, !=
‣
Example: >=2.4
‣
Range: >=1.0,<1.7 (comma separated)
‣
Exact vers...
Versions
‣
Wildcard: 3.*, 4.2.*
‣
Range: >, >=, <=, !=
‣
Example: >=2.4
‣
Range: >=1.0,<1.7 (comma separated)
‣
Next Signi...
Installing Dependencies
composer install
$ composer install
Loading composer repositories with package information
Install...
composer.lock

Saturday, November 2, 13
composer.lock
‣

Saturday, November 2, 13

install writes a dependency lock file
composer.lock
‣
List of exact versions installed
‣

install writes a dependency lock file

Saturday, November 2, 13
composer.lock
‣
List of exact versions installed
‣
Commit both composer.lock and composer.json
‣
install writes a dependen...
composer.lock
‣
List of exact versions installed
‣
Commit both composer.lock and composer.json
‣
install writes a dependen...
composer.lock
‣
List of exact versions installed
‣
Commit both composer.lock and composer.json
‣
install writes a dependen...
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, Novem...
Updating Dependencies
{
"require": {
"monolog/monolog": "1.6.*@dev"
}
}

‣Updates monolog library version
‣Version >= 1.6....
Updating Dependencies
composer update
$ composer update
Loading composer repositories with package information
Updating de...
Updating Dependencies
composer update
$ composer update
Loading composer repositories with package information
Updating de...
Updating Dependencies
composer update
$ composer update
Loading composer repositories with package information
Updating de...
Updating Dependencies
composer update
$ composer update
Loading composer repositories with package information
Updating de...
Adding New Dependencies
Edit composer.json . . .
{
"require": {
"monolog/monolog": "1.6.*@dev",
"ircmaxell/password-compat...
Adding New Dependencies
Or use the command line
composer require
$ composer require ircmaxell/password-compat:1.0.3
compos...
Autoloading

Saturday, November 2, 13
Autoloading
‣

Saturday, November 2, 13

Composer generates vendor/autoload.php
Autoloading
‣
Add require ‘vendor/autoload.php’;
‣

Composer generates vendor/autoload.php

Saturday, November 2, 13
Autoloading
‣
Add require ‘vendor/autoload.php’;
‣
Immediately begin using your dependencies
‣

Composer generates vendor/...
Autoloading
Don’t forget to add your own code!
{
"require": {
"monolog/monolog": "1.6.*@dev"
},
"autoload": {
"psr-0": {
"...
Autoloading
Pro Tip
Grab an autoloader instance and
add more namespaces.
$loader = require 'vendor/autoload.php';
$loader-...
Kickstart a Project
composer create-project
$ composer create-project slim/slim-skeleton super-sweet-application
Installin...
Little Bobby Tables as a Service
composer create-project jeremykendall/lbtaas lbtaas

Saturday, November 2, 13
Little Bobby Tables as a Service
http://lbtaas.dev

{
"status":"success",
"data":{
"name":"Exploits of a Mom",
"permalink"...
Your Very Own Library

Saturday, November 2, 13
Libraries

Saturday, November 2, 13
Libraries
‣

Saturday, November 2, 13

Everyone has written a library of some sort
Libraries
‣
Making up examples is not my strong suit
‣

Everyone has written a library of some sort

Saturday, November 2,...
Libraries
‣
Making up examples is not my strong suit
‣
Let’s walk through a real library . . .
‣

Everyone has written a l...
Libraries
‣
Making up examples is not my strong suit
‣
Let’s walk through a real library . . .
‣
. . . and check out some ...
PHP Domain Parser

https://github.com/jeremykendall/php-domain-parser
Saturday, November 2, 13
{

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
Saturday, November 2, 13

"name": "jeremykendall/php-domain-parser",
"description...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
Now for the cool(er)
stuff . . .

Saturday, November 2, 13
{

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
Saturday, November 2, 13

"name": "jeremykendall/php-domain-parser",
"description...
require-dev

Saturday, November 2, 13
require-dev
‣

Saturday, November 2, 13

Lists packages required for development (think tests)
require-dev
‣
Only applies to the root package
‣

Lists packages required for development (think tests)

Saturday, Novembe...
require-dev
‣
Only applies to the root package
‣
Both install and update install require-dev by default
‣
Lists packages r...
require-dev
‣
Only applies to the root package
‣
Both install and update install require-dev by default
‣
(Use the --no-de...
{
"name": "jeremykendall/php-domain-parser",
"description": "Public Suffix List based URL parsing implemented in PHP.",
"l...
bin

Saturday, November 2, 13
bin
‣

Saturday, November 2, 13

cli scripts to pass along to package users
bin
‣
A set of files that should be treated as binaries
‣
cli scripts to pass along to package users

Saturday, November 2,...
bin
‣
A set of files that should be treated as binaries
‣
Installs binaries to vendor/bin for any project that
‣ depends on...
bin
‣
A set of files that should be treated as binaries
‣
Installs binaries to vendor/bin for any project that
‣ depends on...
{

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
Saturday, November 2, 13

"name": "jeremykendall/php-domain-parser",
"description...
scripts

Saturday, November 2, 13
scripts
‣

Saturday, November 2, 13

Used to execute custom code during the Composer
execution process
scripts
‣
‣

Saturday, November 2, 13

Used to execute custom code during the Composer
execution process
PHP callback (defi...
scripts
‣

Used to execute custom code during the Composer
execution process

‣
. . . or any command-line executable comma...
scripts
‣

Used to execute custom code during the Composer
execution process

‣
. . . or any command-line executable comma...
scripts
‣

Used to execute custom code during the Composer
execution process

‣
. . . or any command-line executable comma...
scripts

Saturday, November 2, 13
scripts
‣

Saturday, November 2, 13

Composer fires “named events” during execution
scripts
‣
Named events include:
‣

Composer fires “named events” during execution

Saturday, November 2, 13
scripts
‣
Named events include:
‣
pre- and post-install-cmd
‣

Composer fires “named events” during execution

Saturday, No...
scripts
‣
Named events include:
‣
pre- and post-install-cmd
‣
pre- and post-update-cmd
‣

Composer fires “named events” dur...
scripts
‣
Named events include:
‣
pre- and post-install-cmd
‣
pre- and post-update-cmd
‣
post-root-package-install
‣

Comp...
scripts
‣
Named events include:
‣
pre- and post-install-cmd
‣
pre- and post-update-cmd
‣
post-root-package-install
‣
Many ...
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...
Example
public static function create(Event $event)
{
$dir = dirname($event->getComposer()->getConfig()->get('vendor-dir')...
You’ve built your library.
Now what?

Saturday, November 2, 13
Push it to a VCS

Saturday, November 2, 13
Push it to a VCS
‣

Saturday, November 2, 13

git, svn, or hg all work equally well
Push it to a VCS
‣
For the sake of simplicity I’ll assume git/github
‣
git, svn, or hg all work equally well

Saturday, No...
Push it to a VCS
‣
For the sake of simplicity I’ll assume git/github
‣
Package versions:
‣
git, svn, or hg all work equall...
Push it to a VCS
‣
For the sake of simplicity I’ll assume git/github
‣
Package versions:
‣
Tags are package versions (1.0....
Push it to a VCS
‣
For the sake of simplicity I’ll assume git/github
‣
Package versions:
‣
Tags are package versions (1.0....
Push it to a VCS
‣
For the sake of simplicity I’ll assume git/github
‣
Package versions:
‣
Tags are package versions (1.0....
Share!

Saturday, November 2, 13
Packagist

Saturday, November 2, 13
Packagist

Saturday, November 2, 13
Packagist
‣

Saturday, November 2, 13

The main package repository for Composer
Packagist
‣
(Aside: Search Packagist before “rolling your own”)
‣
The main package repository for Composer

Saturday, Nove...
Packagist
‣
(Aside: Search Packagist before “rolling your own”)
‣
Packages published there need no special settings in
‣ c...
Packagist
‣
(Aside: Search Packagist before “rolling your own”)
‣
Packages published there need no special settings in
‣ c...
Packagist
‣
(Aside: Search Packagist before “rolling your own”)
‣
Packages published there need no special settings in
‣ c...
Packagist

Saturday, November 2, 13
Packagist: Package Search

Saturday, November 2, 13
Packagist: Keyword Search

Saturday, November 2, 13
Packagist: Package

Saturday, November 2, 13
But what about internal
proprietary packages?

Saturday, November 2, 13
Satis to the Rescue

Saturday, November 2, 13
Satis to the Rescue
‣

Saturday, November 2, 13

Static composer repository generator
Satis to the Rescue
‣
Lightweight, static file based version of Packagist
‣
Static composer repository generator

Saturday,...
Satis to the Rescue
‣
Lightweight, static file based version of Packagist
‣
Simple to configure
‣
Static composer repository...
Satis to the Rescue
‣
Lightweight, static file based version of Packagist
‣
Simple to configure
‣
Flexible
‣
Static composer...
composer create-project composer/satis --stability=dev

$ composer create-project composer/satis --stability=dev --keep-vc...
Satis config.json
{
"name": "Satis Demo",
"homepage": "http://satis.dev",
"repositories": [
{ "type": "vcs", "url": "https:...
Satis config.json
{
"name": "Satis Demo",
"homepage": "http://satis.dev",
"repositories": [
{ "type": "vcs", "url": "https:...
Satis config.json
{
"name": "Satis Demo",
"homepage": "http://satis.dev",
"repositories": [
{ "type": "vcs", "url": "https:...
Satis config.json
{
"name": "Satis Demo",
"homepage": "http://satis.dev",
"repositories": [
{ "type": "vcs", "url": "https:...
Satis config.json
{
"name": "Satis Demo",
"homepage": "http://satis.dev",
"repositories": [
{ "type": "vcs", "url": "https:...
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-dom...
composer.json
{
"repositories": [
{ "type": "composer", "url": "http://satis.dev" }
],
"require": {
"jeremykendall/php-dom...
composer.json
{
"repositories": [
{ "type": "composer", "url": "http://satis.dev" }
],
"require": {
"jeremykendall/php-dom...
Satis Demo Project

Saturday, November 2, 13
Satis Demo Project
‣

Saturday, November 2, 13

Want to goof around with Satis?
Satis Demo Project
‣
See: https://github.com/jeremykendall/satis-demo
‣
Want to goof around with Satis?

Saturday, Novembe...
Satis Demo Project
‣
See: https://github.com/jeremykendall/satis-demo
‣
Clone, follow instructions in README, and WIN
‣
Wa...
Satis Demo Project
‣
See: https://github.com/jeremykendall/satis-demo
‣
Clone, follow instructions in README, and WIN
‣
Sa...
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....
Credits

Saturday, November 2, 13
Credits
‣

Saturday, November 2, 13

Thanks to Rafael Dohms, the Composer presenter
Credits
‣
Thanks to TechCamp for having me
‣

Thanks to Rafael Dohms, the Composer presenter

Saturday, November 2, 13
Credits
‣
Thanks to TechCamp for having me
‣
Thanks to Jordi Boggiano, Nils Adermann, and the
‣ community for an amazing p...
Credits
‣
Thanks to TechCamp for having me
‣
Thanks to Jordi Boggiano, Nils Adermann, and the
‣ community for an amazing p...
Credits
‣
Thanks to TechCamp for having me
‣
Thanks to Jordi Boggiano, Nils Adermann, and the
‣ community for an amazing p...
Thanks!
jeremy@jeremykendall.net
http://about.me/jeremykendall
@jeremykendall
http://365.jeremykendall.net

Saturday, Nove...
Upcoming SlideShare
Loading in...5
×

Game Changing Dependency Management

1,383

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,383
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
9
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "Game Changing Dependency Management"

  1. 1. Composer Game Changing Dependency Management TechCamp Memphis 2013 Saturday, November 2, 13 Jeremy Kendall
  2. 2. Saturday, November 2, 13
  3. 3. I love to code Saturday, November 2, 13
  4. 4. I love to code I’m terribly forgetful Saturday, November 2, 13
  5. 5. I love to code I’m terribly forgetful I take pictures Saturday, November 2, 13
  6. 6. I love to code I’m terribly forgetful I take pictures I work at OpenSky Saturday, November 2, 13
  7. 7. Adding Dependencies is Easy Saturday, November 2, 13
  8. 8. Adding Dependencies is Easy ‣ Saturday, November 2, 13 Copy and Paste
  9. 9. Adding Dependencies is Easy ‣ DIY Solution ‣ Copy and Paste Saturday, November 2, 13
  10. 10. Adding Dependencies is Easy ‣ DIY Solution ‣ SVN Externals ‣ Copy and Paste Saturday, November 2, 13
  11. 11. Adding Dependencies is Easy ‣ DIY Solution ‣ SVN Externals ‣ Git Submodules ‣ Copy and Paste Saturday, November 2, 13
  12. 12. Managing them is Messy Saturday, November 2, 13
  13. 13. What is Composer? Saturday, November 2, 13
  14. 14. What is Composer? ‣ Saturday, November 2, 13 Dependency management tool
  15. 15. What is Composer? ‣ Per-project ‣ Dependency management tool Saturday, November 2, 13
  16. 16. What is Composer? ‣ Per-project ‣ Inspired by: ‣ Dependency management tool Saturday, November 2, 13
  17. 17. What is Composer? ‣ Per-project ‣ Inspired by: ‣ node’s npm ‣ Dependency management tool Saturday, November 2, 13
  18. 18. What is Composer? ‣ Per-project ‣ Inspired by: ‣ node’s npm ‣ ruby’s bundler ‣ Dependency management tool Saturday, November 2, 13
  19. 19. Benefits Saturday, November 2, 13
  20. 20. Benefits ‣ Saturday, November 2, 13 Easily declare project dependencies
  21. 21. Benefits ‣ Updating dependency versions extremely simple ‣ Easily declare project dependencies Saturday, November 2, 13
  22. 22. Benefits ‣ Updating dependency versions extremely simple ‣ Ensures your team is on the same page ‣ Easily declare project dependencies Saturday, November 2, 13
  23. 23. Benefits ‣ Updating dependency versions extremely simple ‣ Ensures your team is on the same page ‣ Tons of excellent related features ‣ Easily declare project dependencies Saturday, November 2, 13
  24. 24. Installing Saturday, November 2, 13
  25. 25. Installing Locally In your project: Saturday, November 2, 13 $ curl -sS https://getcomposer.org/installer | php
  26. 26. Installing Locally In your project: Specify a directory: Saturday, November 2, 13 $ curl -sS https://getcomposer.org/installer | php $ curl -sS https://getcomposer.org/installer | php -- --install-dir=bin
  27. 27. Installing Locally In your project: Specify a directory: What you’ll see: $ curl -sS https://getcomposer.org/installer | php $ curl -sS https://getcomposer.org/installer | php -- --install-dir=bin $ curl -sS https://getcomposer.org/installer | php #!/usr/bin/env php All settings correct for using Composer Downloading... Composer successfully installed to: /Users/jkendall/dev/ composer.phar Use it: php composer.phar Saturday, November 2, 13
  28. 28. Installing Globally Recommended $ curl -sS https://getcomposer.org/installer | php $ mv composer.phar /usr/local/bin/composer Saturday, November 2, 13
  29. 29. Installing Globally Recommended $ curl -sS https://getcomposer.org/installer | php $ mv composer.phar /usr/local/bin/composer (You might need to use sudo) Saturday, November 2, 13
  30. 30. (There’s an installer for Windows folks) Saturday, November 2, 13
  31. 31. Keeping up to Date $ php composer.phar self-update You are using the latest composer version. or $ composer self-update You are using the latest composer version. Saturday, November 2, 13
  32. 32. Keeping up to Date $ php composer.phar self-update You are using the latest composer version. or $ composer self-update You are using the latest composer version. (Always updates to the latest dev-master) Saturday, November 2, 13
  33. 33. Defining Dependencies Saturday, November 2, 13
  34. 34. composer.json { "require": { "monolog/monolog": "1.6.*" } } Saturday, November 2, 13
  35. 35. composer.json { "require": { "monolog/monolog": "1.6.*" } } ‣Place in the root of your project Saturday, November 2, 13
  36. 36. composer.json { "require": { "monolog/monolog": "1.6.*" } } ‣Place in the root of your project ‣“require” specifies package and version Saturday, November 2, 13
  37. 37. 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
  38. 38. 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
  39. 39. 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
  40. 40. Versions Saturday, November 2, 13
  41. 41. Versions ‣ Saturday, November 2, 13 Exact version: 1.0.0, 12.2.4, etc.
  42. 42. Versions ‣ Wildcard: 3.*, 4.2.* ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  43. 43. Versions ‣ Wildcard: 3.*, 4.2.* ‣ Range: >, >=, <=, != ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  44. 44. Versions ‣ Wildcard: 3.*, 4.2.* ‣ Range: >, >=, <=, != ‣ Example: >=2.4 ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  45. 45. Versions ‣ Wildcard: 3.*, 4.2.* ‣ Range: >, >=, <=, != ‣ Example: >=2.4 ‣ Range: >=1.0,<1.7 (comma separated) ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  46. 46. Versions ‣ Wildcard: 3.*, 4.2.* ‣ Range: >, >=, <=, != ‣ Example: >=2.4 ‣ Range: >=1.0,<1.7 (comma separated) ‣ Next Significant Release: ~1.3.3 ‣ Exact version: 1.0.0, 12.2.4, etc. Saturday, November 2, 13
  47. 47. Installing Dependencies composer install $ composer install Loading composer repositories with package information Installing dependencies (including require-dev) - Installing psr/log (1.0.0) Loading from cache - Installing monolog/monolog (1.6.0) Loading from cache monolog/monolog suggests installing monolog/monolog suggests installing monolog/monolog suggests installing monolog/monolog suggests installing Writing lock file Generating autoload files Saturday, November 2, 13 mlehner/gelf-php (Allow sending log messages to a GrayLog2 server) raven/raven (Allow sending log messages to a Sentry server) doctrine/couchdb (Allow sending log messages to a CouchDB server) ext-amqp (Allow sending log messages to an AMQP server (1.0+ required))
  48. 48. composer.lock Saturday, November 2, 13
  49. 49. composer.lock ‣ Saturday, November 2, 13 install writes a dependency lock file
  50. 50. composer.lock ‣ List of exact versions installed ‣ install writes a dependency lock file Saturday, November 2, 13
  51. 51. composer.lock ‣ List of exact versions installed ‣ Commit both composer.lock and composer.json ‣ install writes a dependency lock file Saturday, November 2, 13
  52. 52. composer.lock ‣ List of exact versions installed ‣ Commit both composer.lock and composer.json ‣ install writes a dependency lock file ‣ composer install now checks the lock file, not composer.json Saturday, November 2, 13
  53. 53. composer.lock ‣ List of exact versions installed ‣ Commit both composer.lock and composer.json ‣ install writes a dependency lock file ‣ composer install now checks the lock file, not composer.json ‣ Saturday, November 2, 13 Update dependencies with composer update
  54. 54. Updating Dependencies Saturday, November 2, 13
  55. 55. Updating Dependencies { "require": { "monolog/monolog": "1.6.*@dev" } } Saturday, November 2, 13
  56. 56. Updating Dependencies { "require": { "monolog/monolog": "1.6.*@dev" } } ‣Updates monolog library version Saturday, November 2, 13
  57. 57. Updating Dependencies { "require": { "monolog/monolog": "1.6.*@dev" } } ‣Updates monolog library version ‣Version >= 1.6.0 and < 1.7 (dev) Saturday, November 2, 13
  58. 58. Updating Dependencies composer update $ composer update Loading composer repositories with package information Updating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7 Writing lock file Generating autoload files Saturday, November 2, 13
  59. 59. Updating Dependencies composer update $ composer update Loading composer repositories with package information Updating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7 Writing lock file Generating autoload files ‣Reads from composer.json Saturday, November 2, 13
  60. 60. Updating Dependencies composer update $ composer update Loading composer repositories with package information Updating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7 Writing lock file Generating autoload files ‣Reads from composer.json ‣Updates dependencies Saturday, November 2, 13
  61. 61. Updating Dependencies composer update $ composer update Loading composer repositories with package information Updating dependencies (including require-dev) - Removing monolog/monolog (1.5.0) - Installing monolog/monolog (dev-master c933bb6) Cloning c933bb67a8a2e45c42d0626a0cd6569789bf6ed7 Writing lock file Generating autoload files ‣Reads from composer.json ‣Updates dependencies ‣Rewrites lock file Saturday, November 2, 13
  62. 62. Adding New Dependencies Edit composer.json . . . { "require": { "monolog/monolog": "1.6.*@dev", "ircmaxell/password-compat": "1.0.3" } } Saturday, November 2, 13
  63. 63. Adding New Dependencies Or use the command line composer require $ composer require ircmaxell/password-compat:1.0.3 composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) - Installing ircmaxell/password-compat (1.0.3) Downloading: 100% Writing lock file Generating autoload files Saturday, November 2, 13
  64. 64. Autoloading Saturday, November 2, 13
  65. 65. Autoloading ‣ Saturday, November 2, 13 Composer generates vendor/autoload.php
  66. 66. Autoloading ‣ Add require ‘vendor/autoload.php’; ‣ Composer generates vendor/autoload.php Saturday, November 2, 13
  67. 67. Autoloading ‣ Add require ‘vendor/autoload.php’; ‣ Immediately begin using your dependencies ‣ Composer generates vendor/autoload.php Saturday, November 2, 13
  68. 68. Autoloading Don’t forget to add your own code! { "require": { "monolog/monolog": "1.6.*@dev" }, "autoload": { "psr-0": { "Beeblebrox": "src/" } } } Saturday, November 2, 13
  69. 69. Autoloading Pro Tip Grab an autoloader instance and add more namespaces. $loader = require 'vendor/autoload.php'; $loader->add('AcmeTest', __DIR__); Saturday, November 2, 13
  70. 70. Kickstart a Project composer create-project $ composer create-project slim/slim-skeleton super-sweet-application Installing slim/slim-skeleton (1.1.0) - Installing slim/slim-skeleton (1.1.0) Downloading: 100% Created project in super-sweet-application Loading composer repositories with package information Installing dependencies (including require-dev) - Installing slim/slim (2.3.0) Downloading: 100% - Installing slim/extras (2.0.3) Loading from cache - Installing twig/twig (v1.13.1) Loading from cache Writing lock file Generating autoload files Saturday, November 2, 13
  71. 71. Little Bobby Tables as a Service composer create-project jeremykendall/lbtaas lbtaas Saturday, November 2, 13
  72. 72. Little Bobby Tables as a Service http://lbtaas.dev { "status":"success", "data":{ "name":"Exploits of a Mom", "permalink":"http://xkcd.com/327/", "image":"http://imgs.xkcd.com/comics/exploits_of_a_mom.png" } } Saturday, November 2, 13
  73. 73. Your Very Own Library Saturday, November 2, 13
  74. 74. Libraries Saturday, November 2, 13
  75. 75. Libraries ‣ Saturday, November 2, 13 Everyone has written a library of some sort
  76. 76. Libraries ‣ Making up examples is not my strong suit ‣ Everyone has written a library of some sort Saturday, November 2, 13
  77. 77. Libraries ‣ Making up examples is not my strong suit ‣ Let’s walk through a real library . . . ‣ Everyone has written a library of some sort Saturday, November 2, 13
  78. 78. Libraries ‣ Making up examples is not my strong suit ‣ Let’s walk through a real library . . . ‣ . . . and check out some awesome Composer features ‣ Everyone has written a library of some sort Saturday, November 2, 13
  79. 79. PHP Domain Parser https://github.com/jeremykendall/php-domain-parser Saturday, November 2, 13
  80. 80. { } Saturday, November 2, 13 "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] }
  81. 81. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Package requirements } Saturday, November 2, 13
  82. 82. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Package requirements } Saturday, November 2, 13 Autoloading
  83. 83. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Add the “name” key and it’s installable } Saturday, November 2, 13
  84. 84. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Additional metadata } Saturday, November 2, 13
  85. 85. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Don’t forget the license! } Saturday, November 2, 13
  86. 86. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } Full fledged library! } Saturday, November 2, 13
  87. 87. Now for the cool(er) stuff . . . Saturday, November 2, 13
  88. 88. { } Saturday, November 2, 13 "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } require-dev
  89. 89. require-dev Saturday, November 2, 13
  90. 90. require-dev ‣ Saturday, November 2, 13 Lists packages required for development (think tests)
  91. 91. require-dev ‣ Only applies to the root package ‣ Lists packages required for development (think tests) Saturday, November 2, 13
  92. 92. require-dev ‣ Only applies to the root package ‣ Both install and update install require-dev by default ‣ Lists packages required for development (think tests) Saturday, November 2, 13
  93. 93. require-dev ‣ Only applies to the root package ‣ Both install and update install require-dev by default ‣ (Use the --no-dev flag to skip installing dev ‣ dependencies) Lists packages required for development (think tests) Saturday, November 2, 13
  94. 94. { "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], } Saturday, November 2, 13 bin "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] }
  95. 95. bin Saturday, November 2, 13
  96. 96. bin ‣ Saturday, November 2, 13 cli scripts to pass along to package users
  97. 97. bin ‣ A set of files that should be treated as binaries ‣ cli scripts to pass along to package users Saturday, November 2, 13
  98. 98. bin ‣ A set of files that should be treated as binaries ‣ Installs binaries to vendor/bin for any project that ‣ depends on your project cli scripts to pass along to package users Saturday, November 2, 13
  99. 99. bin ‣ A set of files that should be treated as binaries ‣ Installs binaries to vendor/bin for any project that ‣ depends on your project cli scripts to pass along to package users ‣ Saturday, November 2, 13 php-domain-parser uses a bin to update the local copy of the public suffix list
  100. 100. { } Saturday, November 2, 13 "name": "jeremykendall/php-domain-parser", "description": "Public Suffix List based URL parsing implemented in PHP.", "license": "MIT", "authors": [ { "name": "Jeremy Kendall", "homepage": "http://about.me/jeremykendall", "role": "Developer" } ], "bin": ["bin/pdp-psl"], "keywords": ["Public Suffix List", "domain parsing", "url parsing"], "require": { "php": ">=5.3.0", "ext-curl": "*" }, "require-dev": { "mikey179/vfsStream": "1.1.*", "jeremykendall/phpctagger": "0.0.*" }, "autoload": { "psr-0": { "Pdp": "library/" } }, "scripts": { "post-install-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ], "post-update-cmd": [ "PhpCtaggerComposerScriptCtagger::ctag" ] } scripts
  101. 101. scripts Saturday, November 2, 13
  102. 102. scripts ‣ Saturday, November 2, 13 Used to execute custom code during the Composer execution process
  103. 103. scripts ‣ ‣ Saturday, November 2, 13 Used to execute custom code during the Composer execution process PHP callback (defined as a static method) . . .
  104. 104. scripts ‣ Used to execute custom code during the Composer execution process ‣ . . . or any command-line executable command ‣ PHP callback (defined as a static method) . . . Saturday, November 2, 13
  105. 105. scripts ‣ Used to execute custom code during the Composer execution process ‣ . . . or any command-line executable command ‣ Only scripts defined in the root composer.json are ‣ executed PHP callback (defined as a static method) . . . Saturday, November 2, 13
  106. 106. scripts ‣ Used to execute custom code during the Composer execution process ‣ . . . or any command-line executable command ‣ Only scripts defined in the root composer.json are ‣ executed PHP callback (defined as a static method) . . . ‣ Saturday, November 2, 13 If a script is defined in a dependency, you can use it in your composer.json
  107. 107. scripts Saturday, November 2, 13
  108. 108. scripts ‣ Saturday, November 2, 13 Composer fires “named events” during execution
  109. 109. scripts ‣ Named events include: ‣ Composer fires “named events” during execution Saturday, November 2, 13
  110. 110. scripts ‣ Named events include: ‣ pre- and post-install-cmd ‣ Composer fires “named events” during execution Saturday, November 2, 13
  111. 111. scripts ‣ Named events include: ‣ pre- and post-install-cmd ‣ pre- and post-update-cmd ‣ Composer fires “named events” during execution Saturday, November 2, 13
  112. 112. scripts ‣ Named events include: ‣ pre- and post-install-cmd ‣ pre- and post-update-cmd ‣ post-root-package-install ‣ Composer fires “named events” during execution Saturday, November 2, 13
  113. 113. scripts ‣ Named events include: ‣ pre- and post-install-cmd ‣ pre- and post-update-cmd ‣ post-root-package-install ‣ Many more . . . ‣ Composer fires “named events” during execution Saturday, November 2, 13
  114. 114. Running scripts Saturday, November 2, 13
  115. 115. Running scripts Execute Composer (script will execute if the named event is triggered) or . . . Saturday, November 2, 13
  116. 116. Running scripts Execute Composer (script will execute if the named event is triggered) or . . . Saturday, November 2, 13
  117. 117. Running scripts Execute Composer (script will execute if the named event is triggered) or . . . composer run-script <named event> Saturday, November 2, 13
  118. 118. 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
  119. 119. You’ve built your library. Now what? Saturday, November 2, 13
  120. 120. Push it to a VCS Saturday, November 2, 13
  121. 121. Push it to a VCS ‣ Saturday, November 2, 13 git, svn, or hg all work equally well
  122. 122. Push it to a VCS ‣ For the sake of simplicity I’ll assume git/github ‣ git, svn, or hg all work equally well Saturday, November 2, 13
  123. 123. Push it to a VCS ‣ For the sake of simplicity I’ll assume git/github ‣ Package versions: ‣ git, svn, or hg all work equally well Saturday, November 2, 13
  124. 124. Push it to a VCS ‣ For the sake of simplicity I’ll assume git/github ‣ Package versions: ‣ Tags are package versions (1.0.0, v2.5.4, etc) ‣ git, svn, or hg all work equally well Saturday, November 2, 13
  125. 125. Push it to a VCS ‣ For the sake of simplicity I’ll assume git/github ‣ Package versions: ‣ Tags are package versions (1.0.0, v2.5.4, etc) ‣ Branches are dev versions (dev-{branchname}, ‣ {branchname}-dev) git, svn, or hg all work equally well Saturday, November 2, 13
  126. 126. Push it to a VCS ‣ For the sake of simplicity I’ll assume git/github ‣ Package versions: ‣ Tags are package versions (1.0.0, v2.5.4, etc) ‣ Branches are dev versions (dev-{branchname}, ‣ {branchname}-dev) git, svn, or hg all work equally well ‣ Saturday, November 2, 13 For this reason, I strongly recommend using semantic versioning: http://semver.org
  127. 127. Share! Saturday, November 2, 13
  128. 128. Packagist Saturday, November 2, 13
  129. 129. Packagist Saturday, November 2, 13
  130. 130. Packagist ‣ Saturday, November 2, 13 The main package repository for Composer
  131. 131. Packagist ‣ (Aside: Search Packagist before “rolling your own”) ‣ The main package repository for Composer Saturday, November 2, 13
  132. 132. Packagist ‣ (Aside: Search Packagist before “rolling your own”) ‣ Packages published there need no special settings in ‣ composer.json to be installable (see “repositories” key) The main package repository for Composer Saturday, November 2, 13
  133. 133. Packagist ‣ (Aside: Search Packagist before “rolling your own”) ‣ Packages published there need no special settings in ‣ composer.json to be installable (see “repositories” key) The main package repository for Composer ‣ Saturday, November 2, 13 Submitting is dead simple
  134. 134. Packagist ‣ (Aside: Search Packagist before “rolling your own”) ‣ Packages published there need no special settings in ‣ composer.json to be installable (see “repositories” key) The main package repository for Composer ‣ Create account, hit big green submit button ‣ Submitting is dead simple Saturday, November 2, 13
  135. 135. Packagist Saturday, November 2, 13
  136. 136. Packagist: Package Search Saturday, November 2, 13
  137. 137. Packagist: Keyword Search Saturday, November 2, 13
  138. 138. Packagist: Package Saturday, November 2, 13
  139. 139. But what about internal proprietary packages? Saturday, November 2, 13
  140. 140. Satis to the Rescue Saturday, November 2, 13
  141. 141. Satis to the Rescue ‣ Saturday, November 2, 13 Static composer repository generator
  142. 142. Satis to the Rescue ‣ Lightweight, static file based version of Packagist ‣ Static composer repository generator Saturday, November 2, 13
  143. 143. Satis to the Rescue ‣ Lightweight, static file based version of Packagist ‣ Simple to configure ‣ Static composer repository generator Saturday, November 2, 13
  144. 144. Satis to the Rescue ‣ Lightweight, static file based version of Packagist ‣ Simple to configure ‣ Flexible ‣ Static composer repository generator Saturday, November 2, 13
  145. 145. composer create-project composer/satis --stability=dev $ composer create-project composer/satis --stability=dev --keep-vcs Installing composer/satis (dev-master 059588ef0fd0977964ad13637e02012519686202) - Installing composer/satis (dev-master master) Cloning master Created project in /Users/jkendall/dev/satis Loading composer repositories with package information Installing dependencies (including require-dev) from lock file Warning: The lock file is not up to date with the latest changes in composer.json . . . - Installing symfony/process (dev-master 75c8101) Cloning 75c810176f8e069714cef8696d7ecc3aa86e8168 - [ . . . ] - Installing twig/twig (v1.13.1) Loading from cache symfony/console suggests installing symfony/event-dispatcher () Generating autoload files Saturday, November 2, 13
  146. 146. 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
  147. 147. 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
  148. 148. 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
  149. 149. 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
  150. 150. 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
  151. 151. Build Repo $ php bin/satis build config.json web/ Saturday, November 2, 13
  152. 152. composer.json { "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" } } Saturday, November 2, 13
  153. 153. composer.json { "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" } } Saturday, November 2, 13
  154. 154. composer.json { "repositories": [ { "type": "composer", "url": "http://satis.dev" } ], "require": { "jeremykendall/php-domain-parser": "0.0.7" } } Saturday, November 2, 13
  155. 155. Satis Demo Project Saturday, November 2, 13
  156. 156. Satis Demo Project ‣ Saturday, November 2, 13 Want to goof around with Satis?
  157. 157. Satis Demo Project ‣ See: https://github.com/jeremykendall/satis-demo ‣ Want to goof around with Satis? Saturday, November 2, 13
  158. 158. Satis Demo Project ‣ See: https://github.com/jeremykendall/satis-demo ‣ Clone, follow instructions in README, and WIN ‣ Want to goof around with Satis? Saturday, November 2, 13
  159. 159. Satis Demo Project ‣ See: https://github.com/jeremykendall/satis-demo ‣ Clone, follow instructions in README, and WIN ‣ Satis really is dead simple to set up ‣ Want to goof around with Satis? Saturday, November 2, 13
  160. 160. Parting Tips and Tricks Saturday, November 2, 13
  161. 161. composer install --no-dev --prefer-dist --optimize-autoloader Saturday, November 2, 13
  162. 162. “example/package”: “2.3.x-dev#5aec89a” Saturday, November 2, 13
  163. 163. Non-Composer and PEAR packages can be installed (see “repositories” key documentation) Saturday, November 2, 13
  164. 164. archive key Saturday, November 2, 13
  165. 165. http://getcomposer.org #composer on irc.freenode.org Saturday, November 2, 13
  166. 166. There’s So Much More! Saturday, November 2, 13
  167. 167. Credits Saturday, November 2, 13
  168. 168. 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
  169. 169. Credits Saturday, November 2, 13
  170. 170. Credits ‣ Saturday, November 2, 13 Thanks to Rafael Dohms, the Composer presenter
  171. 171. Credits ‣ Thanks to TechCamp for having me ‣ Thanks to Rafael Dohms, the Composer presenter Saturday, November 2, 13
  172. 172. Credits ‣ Thanks to TechCamp for having me ‣ Thanks to Jordi Boggiano, Nils Adermann, and the ‣ community for an amazing project (and all the Thanks to Rafael Dohms, the Composer presenter documentation I cribbed from) Saturday, November 2, 13
  173. 173. Credits ‣ Thanks to TechCamp for having me ‣ Thanks to Jordi Boggiano, Nils Adermann, and the ‣ community for an amazing project (and all the Thanks to Rafael Dohms, the Composer presenter documentation I cribbed from) ‣ Saturday, November 2, 13 Thanks to our sponsors for help making this happen
  174. 174. Credits ‣ Thanks to TechCamp for having me ‣ Thanks to Jordi Boggiano, Nils Adermann, and the ‣ community for an amazing project (and all the Thanks to Rafael Dohms, the Composer presenter documentation I cribbed from) ‣ Thanks to all of you for being here ‣ Thanks to our sponsors for help making this happen Saturday, November 2, 13
  175. 175. Thanks! jeremy@jeremykendall.net http://about.me/jeremykendall @jeremykendall http://365.jeremykendall.net Saturday, November 2, 13
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×