composer

57
Composer Dependency management for PHP

Upload: adan-lobato-lorenzo

Post on 20-Jun-2015

433 views

Category:

Technology


5 download

DESCRIPTION

These are the slides of the talk I gave at Trovit on October 2013. It covers from Composer Basics to some more advanced tips and tricks.

TRANSCRIPT

Page 1: Composer

ComposerDependency management for PHP

Page 2: Composer

What’s up!

•  Soy Adán Lobato

•  Soy de Barcelona

•  Soy software developer

•  Trabajo en SocialPoint

•  Mi twitter es @adanlobato

¡Interrumpidme cuando queráis!

2

Page 3: Composer

Agenda

•  Composer Basics

•  Mastering Composer

•  Bottlenecks

•  Enlaces de interés

•  ¿Preguntas?

3

Page 4: Composer

Composer Basics

Page 5: Composer

¿Qué es Composer?

Es una herramienta que nos permite definir cuáles son las librerías de

las que depende nuestro proyecto y las instala por nosotros.

Jordi Boggiano (@seldaek)

5

Page 6: Composer

¿Es un concepto nuevo?

•  En python existe pip

•  En javascript existe npm

•  En ruby existe bundler

•  En php existe… ¿ PEAR / Pyrus ?

6

Page 7: Composer

7

Page 8: Composer

¿Alternativas en PHP?

PEAR Pyrus Composer

Instalación Global Global/Local Global*/Local

Package types Dist Dist Dist/Source

PEAR support Yes Yes Yes

VCS support No No Yes

(*) Only CLI applications

8

Page 9: Composer

Instalación

Page 10: Composer

Instalación

curl -S http://getcomposer.org/installer | php

10

Page 11: Composer

Instalación

$ php composer.phar ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___// /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/Composer version 3da05c68f9561fa822c522b1815435ff990493ff 2013-10-02 14:25:06

Usage: [options] command [arguments]

Available commands: init Creates a basic composer.json file in current directory. install Installs the project dependencies from the composer.lock file... require Adds required packages to your composer.json and installs them search Search for packages self-update Updates composer.phar to the latest version. show Show information about packages status Show a list of locally modified packages update Updates your dependencies to the latest version according to... validate Validates a composer.json

11

Page 12: Composer

Instalación

$ sudo mv composer.phar /usr/local/bin/composer

$ sudo chmod +x /usr/local/bin

$ sudo composer self-update

01.

02.

03.

12

Page 13: Composer

Primeros pasos

Page 14: Composer

Instalando dependencias

$ composer require twig/twig "1.*"

14

Page 15: Composer

Instalando dependencias

2.0.1

15

Page 16: Composer

Instalando dependencias

2.0.*

16

Page 17: Composer

Instalando dependencias

>=2.1,<3.0

17

Page 18: Composer

Instalando dependencias

~2.1

18

Page 19: Composer

Analizando el resultado

$ tree -L 3

├── composer.json

├── composer.lock

└── vendor

├── autoload.php

├── composer

│ ├── ClassLoader.php

│ ├── autoload_classmap.php

│ ├── autoload_namespaces.php

│ ├── autoload_real.php

│ └── installed.json

└── twig

└── twig

19

Page 20: Composer

composer.json

{

"require": {

"twig/twig" : "1.*"

}

}

01.

02.

03.

04.

05.

20

Page 21: Composer

composer.lock

•  Si existe, reemplaza a composer.json

•  Congela nuestras dependencias a una versión concreta

•  Permite que todo el equipo trabaje/testee sobre las mismas versiones

•  Imprescindible para deployments

•  Debe estar commiteado en el VCS de nuestro proyecto

•  Para actualizarlo: composer update

21

Page 22: Composer

Autoloading

<?php

require_once __DIR__.'/vendor/autoload.php';

// Your code

01.

02.

03.

04.

05.

06.

07.

22

Page 23: Composer

Autoloading

<?php

$loader = require_once __DIR__.'/vendor/autoload.php';

$loader->add('My\Namespace', array('src'));

$loader->add('My_Namespace', array('src', 'lib'));

$loader->addClassmap($classmap);

// Your code

01.

02.

03.

04.

05.

06.

07.

23

Page 24: Composer

Repositorios

Page 25: Composer

Packagist

•  Repositorio central de paquetes de Composer

•  Actúa como proxy entre los repositorios VCS y los usuarios de Composer

•  Puede almacenar cualquier tipo de librería PHP: components, bundles,

plugins, módulos…

•  Todo proyecto Open Source debería estar en Packagist

•  Buen lugar dónde encontrar librerías para tu aplicación

25

Page 26: Composer

VCS: git, svn, hg…{

"repositories": [

{

"type": "vcs",

"url": "https://github.com/symfony/Yaml"

}

],

"require": {

"symfony/yaml": "2.3.*"

}

}

26

Page 27: Composer

PEAR

{

"repositories": [

{

"type": "pear",

"url": "http://pear2.php.net"

}

],

"require": {

"pear-pear2.php.net/PEAR2_Text_Markdown": "*",

"pear-pear2/PEAR2_HTTP_Request": "*"

}

}

27

Page 28: Composer

Repositorios sin composer.json

{ "repositories": [ { "type": "package", "package": { "name": "smarty/smarty", "version": "3.1.7", "dist": { "url": "http://www.smarty.net/files/Smarty-3.1.7.zip", "type": "zip" }, "source": { "url": "http://smarty-php.googlecode.com/svn/", "type": "svn", "reference": "tags/Smarty_3_1_7/distribution/" }, "autoload": { "classmap": ["libs/"] } } } ], "require": { "smarty/smarty": "3.1.*" }}

28

Page 29: Composer

Creando unpaquete

Page 30: Composer

Creando un paquete

{ "name": "trovit/foo", "description": "Super cool library for foo stuff", "homepage": "http://foo.trovit.es", "license": "MIT", "authors": [ { "name": "Trovit backend team", "email": "[email protected]"} ], "autoload": { "psr-0": { "Trovit\\Foo": "src/" } }, "require": { "php": ">=5.3.2", "ext-curl": "*", "symfony/console": "2.3.~" }}

30

Page 31: Composer

Creando un paquete: Autoloading

"autoload": {

"psr-0": {

"Trovit\Foo": "src/"

}

}

01.

02.

03.

04.

05.

31

Page 32: Composer

Creando un paquete: Autoloading

"autoload": {

"psr-0": {

"Trovit_": "src/"

}

}

01.

02.

03.

04.

05.

32

Page 33: Composer

Creando un paquete: Autoloading

"autoload": {

"classmap": ["src/", "lib/"]

}

01.

02.

03.

33

Page 34: Composer

Creando un paquete: Autoloading

"autoload": {

"files": ["src/Trovit/functions.php"]

}

01.

02.

03.

34

Page 35: Composer

Scripts

Page 36: Composer

Scripts

Permiten ejecutar acciones ante determinados eventos de Composer.

•  pre|post-install-cmd

•  pre|post-update-cmd

•  pre|post-package-install

•  pre|post-package-update

36

Page 37: Composer

Scripts

{

"scripts": {

"post-install-cmd": [

"My\\Namescape\\ScriptHandler::buildBootstrap"

],

"post-update-cmd": [

"rm -rf app/cache/*"

]

}

}

37

Page 38: Composer

Instaladores

Page 39: Composer

Instaladores oficiales

•  Wordpress

•  Drupal

•  CakePHP

•  CodeIgniter

•  Laravel

•  ¡Y muchos más!

http://github.com/composer/installers

39

Page 40: Composer

Instaladores propios

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

40

Page 41: Composer

MasteringComposer

Page 42: Composer

Semantic versioning

X.Y.Zhttp://semver.org/spec/v2.0.0.html

42

Page 43: Composer

Branch aliases

"extra": {

"branch-alias": {

"dev-master": "1.0.x-dev"

}

}

01.

02.

03.

04.

05.

43

Page 44: Composer

Trabajando con forks

{

"repositories": [

{

"type": "vcs",

"url": "https://github.com/adanlobato/Yaml"

}

],

"require": {

"symfony/yaml": "dev-hotfix"

}

}

44

Page 45: Composer

Trabajando con forks

{

"repositories": [

{

"type": "vcs",

"url": "https://github.com/adanlobato/Yaml"

}

],

"require": {

"symfony/yaml": "dev-hotfix as 1.0.x-dev"

}

}

45

Page 46: Composer

Minimum stability

{

"minimum-stability": "stable",

"require": {

"symfony/config": "2.3",

"symfony/yaml": "2.3.*@dev",

"symfony/console": "2.3.*@beta"

}

}

46

Page 47: Composer

Autoloading optimizado

$ composer dump-autoload --optimize

47

Page 48: Composer

Repositorios privados: Satis

•  Es una versión reducida de Packagist

•  Se instala y se configura muy rápido

•  Es ideal para repositorios privados

48

Page 49: Composer

Repositorios privados: Satis

$ composer create-project composer/satis

49

Page 50: Composer

Repositorios privados: Satis

// config.json

{

"name": "Trovit Repository",

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

"require-all": true,

"repositories": [

{

"type": "git",

"url": "https://github.com/trovit/super-cool-library"

}

]

}

50

Page 51: Composer

Repositorios privados: Satis

$ php bin/satis build config.json web/

51

Page 52: Composer

Repositorios privados: Satis

Para protegerlo del exterior:

•  Basic HTTP Authentication

•  SSH

•  Red privada

52

Page 53: Composer

Repositorios privados: Packagist

•  Packagist es Open Source

•  Puedes instalarte tu propio packagist

•  Soporta Github Webhooks

53

Page 54: Composer

Bottlenecks

Page 55: Composer

Bottlenecks

•  Dependency Solver

•  Github

•  Github post-receive hooks

•  Repositorios privados

55

Page 56: Composer

Enlaces de interés

•  getcomposer.org

•  packagist.org

•  github.com/composer

56

Page 57: Composer

¿Preguntas?