mastering composer

66
Mastering Composer Adán Lobato

Upload: adan-lobato-lorenzo

Post on 06-May-2015

8.897 views

Category:

Technology


8 download

TRANSCRIPT

Page 1: Mastering composer

Mastering ComposerAdán Lobato

Page 2: Mastering composer

What’s up!

• Soy Adán Lobato

• Soy de Barcelona

• Soy software developer

• Backend Developer en SocialPoint

• Mi twitter es @adanlobato

Page 3: Mastering composer

Agenda

• Minimum stability

• Branch aliases

• Semantic versioning

• Private Repositories

• Installers

• Embedded Composer

• Useful links

Page 4: Mastering composer

Parental Advisory

Page 5: Mastering composer

Minimum stability

Page 6: Mastering composer

Minimum stability, the problem

Page 7: Mastering composer

Minimum stability exposed

Stable!

RC

Beta

Alpha

Dev

“minimum-stability”:

@stable

@rc

@beta

@alpha

@dev

Page 8: Mastering composer

minimum-stability, the global solution

{

"require": {

"php": ">=5.3.3",

"symfony/icu": "~1.0",

"doctrine/common": "~2.2",

"twig/twig": "~1.11",

"psr/log": "~1.0"

},

“minimum-stability”: “dev”

}

Page 9: Mastering composer

@stability flags, the specific solution

{

"require": {

"php": ">=5.3.3",

"symfony/icu": "~1.0",

"doctrine/common": “~2.2@dev",

"twig/twig": "~1.11",

"psr/log": "~1.0"

}

}

Page 10: Mastering composer

@stability flags, recursive stability

{

"require": {

"php": ">=5.3.3",

"symfony/icu": "~1.0",

"doctrine/orm": “~2.2",

"doctrine/dbal": “@dev",

"twig/twig": "~1.11",

"psr/log": "~1.0"

}

}

Page 11: Mastering composer

prefer-stable, the “magic” solution

{

"require": {

"php": ">=5.3.3",

"symfony/icu": "~1.0",

"doctrine/common": "~2.2",

"twig/twig": "~1.11",

"psr/log": "~1.0"

},

“prefer-stable”: true

}

Page 12: Mastering composer

Branch aliases

Page 13: Mastering composer

Branch aliases, the problem

Page 14: Mastering composer

Branch aliases, the bad practice

{

"require": {

“welovephp/foobar”: “dev-master”

}

}

Page 15: Mastering composer

Branch aliases, the solution

{

“name”: “welovephp/foobar”

"extra": {

"branch-alias": {

"dev-master": "2.5-dev"

}

}

}

Page 16: Mastering composer

Branch aliases & stability flags

{

"require": {

“welovephp/foobar”: “2.5.*@dev”

}

}

Page 17: Mastering composer

Branch aliases, inline aliases

{

"require": {

“welovephp/foobar”: “my-branch as 2.5-dev”

}

}

Page 18: Mastering composer

Semantic Versioning

Page 19: Mastering composer

Semantic versioning

X.Y.Z

Page 20: Mastering composer

Semantic versioning

X.Y.Z

Page 21: Mastering composer

Semantic versioning

X.Y.Z

Page 22: Mastering composer

Semantic versioning

X.Y.Z

Page 23: Mastering composer

Semantic versioning

1.*

Page 24: Mastering composer

Semantic versioning

>=1.1,<2.0

Page 25: Mastering composer

Semantic versioning

~1.1

Page 26: Mastering composer

PrivateRepositories

Page 27: Mastering composer

Private Repositories, the basics

{

“repositories”: [

{

“type”: “git”,

“url”: “[email protected]/welovephp/foobar.git”

}

]

}

Page 28: Mastering composer

Private Repositories, the basics

{

“repositories”: [

{ “type”: “git”, “url”: “[email protected]/welovephp/foobar.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/foobar-bundle.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/fizz.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/buzz.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/fizzbuzz-bundle.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/qwerty.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/doe.git” }

]

}

Page 29: Mastering composer

Private Repositories, the basics

Page 30: Mastering composer

Private Repositories, the basics

Page 31: Mastering composer

Private Repositories:Satis

Page 32: Mastering composer

Private Repositories, Satis

$ composer create-project composer/satis

Page 33: Mastering composer

Private Repositories, Satis

// config.json

{

"name": "WelovePhp",

"homepage": "http://packages.welovephp.es",

"require-all": true,

“repositories”: [

{ “type”: “git”, “url”: “[email protected]/welovephp/foobar.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/foobar-bundle.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/fizz.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/buzz.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/fizzbuzz-bundle.git” },

{ “type”: “git”, “url”: “[email protected]/welovephp/qwerty.git” }

]

}

Page 34: Mastering composer

Private Repositories, Satis

$ php bin/satis build config.json web/

Page 35: Mastering composer

Private Repositories, Satis

Page 36: Mastering composer

Private Repositories, Satis

{

"repositories": [

{

"type": "composer",

"url": “http://packages.welovephp.es/“

}

]

}

Page 37: Mastering composer

Private Repositories, Satis

Security:

• Basic HTTP Authentication

• SSH

• Private network

!

Updates

• CRON job

Page 38: Mastering composer

Private Repositories:Packagist

Page 39: Mastering composer

Private Repositories, Packagist

• Packagist is an Open Source project

• It is built as a Symfony application

• You can have your own private Packagist

• Supports Github Webhooks

Page 40: Mastering composer

Private Repositories, Packagist

Requirements:

• MySQL

• Redis

• Solr

• git / svn / hg

Page 41: Mastering composer

Private Repositories:Bottlenecks

Page 42: Mastering composer

Private Repositories, the bottlenecks

Page 43: Mastering composer

Installers

Page 44: Mastering composer

Installers, the official ones

• Wordpress

• Drupal

• CakePHP

• CodeIgniter

• Laravel

• Tons more!

http://github.com/composer/installers

Page 45: Mastering composer

Installers, building your own installer

{

"name": "welovephp/blog-module",

"type": “welovephp-module",

"require": {

“welovephp/module-installer-plugin“: "*"

}

}

Page 46: Mastering composer

Installers, building your own installer

{

"name": “welovephp/module-installer-plugin",

"type": "composer-plugin",

"autoload": {

"psr-0": {"WeLovePhp\\Composer": "src/"}

},

"extra": {

"class": "WeLovePhp\\Composer\\ModuleInstallerPlugin"

},

"require": { "composer-plugin-api": “1.0.0" }

}

Page 47: Mastering composer

Installers, building your own installer

namespace WeLovePhp\Composer;

class ModuleInstallerPlugin implements PluginInterface

{

public function activate(Composer $composer, IOInterface $io)

{

$installer = new ModuleInstaller($io, $composer);

$composer->getInstallationManager()->addInstaller($installer);

}

}

Page 48: Mastering composer

Installers, building your own installer

namespace phpDocumentor\Composer;

!class ModuleInstaller extends LibraryInstaller

{

public function getPackageBasePath(PackageInterface $package)

{

return 'welovephp/modules/'.$package->getPrettyName();

}

! public function supports($packageType)

{

return ‘welovephp-module' === $packageType;

}

}

Page 49: Mastering composer

Embedded Composer

By Beau Simensen

Page 50: Mastering composer

Embedded Composer, the problem

• You have an application

• Your application has dependencies

• Your application can be extended via third-party plugins

• Those plugins depend on your app, but can have other extra dependencies

• Both, app & plugins dependencies, must be installed once and be compatible between them

Page 51: Mastering composer

Embedded Composer, the solution

We need to be able to run Composer on runtime

Page 52: Mastering composer

Embedded Composer & Sculpin.io

Page 53: Mastering composer

Commands you must know

Page 54: Mastering composer

diagnose

$ composer diagnose

Checks common errors to help debugging problems.

Page 55: Mastering composer

—verbose

$ composer command […] -v|vv|vvv

Increase output verbosity. Useful for debugging.

Page 56: Mastering composer

config —global

$ composer config —global […]

Read/Write Composer global settings.

Page 57: Mastering composer

global

$ composer global require phpunit/phpunit

Add COMPOSER_HOME/vendor/bin to PATH

!

Run Composer operations globally. Useful for CLI tools.

Page 58: Mastering composer

status

$ composer status

Displays a list of dependencies that have been modified locally.

Page 59: Mastering composer

show

$ composer show package/name

Displays detailed information about a package.

Page 60: Mastering composer

dump-autoload —optimize

$ composer dump-autoload —optimize

Dumps a classmap for PSR-0 vendors.

Page 61: Mastering composer

Useful links

Page 62: Mastering composer

Useful links

Composer

• http://getcomposer.org/doc/

• https://github.com/composer/composer

• https://packagist.org/

• #composerphp at twitter

!

Composer Basics

• http://www.slideshare.net/adanlobato/composer-gestor-de-dependencias-para-php

• http://www.youtube.com/watch?v=U1dTiDlUUmU

• http://adanlobato.github.io/composer-2013

Page 63: Mastering composer

Useful links

Minimum stability

• http://getcomposer.org/doc/04-schema.md#minimum-stability

• http://getcomposer.org/doc/04-schema.md#package-links

• https://igor.io/2013/02/07/composer-stability-flags.html

!

Branch alias

• http://getcomposer.org/doc/articles/aliases.md

• https://igor.io/2013/01/07/composer-versioning.html

!

Semantic versioning

• http://semver.org/

Page 64: Mastering composer

Useful links

Private Repositories

• https://github.com/composer/satis

• https://github.com/composer/packagist

• https://help.github.com/articles/post-receive-hooks

!

Installers

• http://getcomposer.org/doc/articles/custom-installers.md

• https://github.com/composer/installers

!

Page 65: Mastering composer

Useful links

Embedded Composer

• https://speakerdeck.com/simensen/embedded-composer-sflive-portland-2013

• https://github.com/dflydev/dflydev-embedded-composer

• https://github.com/sculpin

!

Page 66: Mastering composer

That’s all folks!Questions?