Composer: Gestionando dependencias en PHP

106
Gestionando dependencias en PHP C!"p#$r Javier Núñez @javiernuber Septiembre 2014

description

Composer es un administrador de paquetes flexible, simple y que se encarga de la administración de dependencias de nuestro proyecto. Está inspirado en npm de node.js y Bundler de Ruby. Composer ha cambiado la comunidad PHP y está reinventado la forma de trabajar con PHP. Gracias a Composer la comunidad PHP es más feliz y podrá dejar de reinventar la rueda una y otra vez.

Transcript of Composer: Gestionando dependencias en PHP

Page 1: Composer: Gestionando dependencias en PHP

Gestionando dependencias en PHP

C!"p#$r

Javier Núñez @javiernuber

Septiembre 2014

Page 2: Composer: Gestionando dependencias en PHP
Page 3: Composer: Gestionando dependencias en PHP

I%&r!'())*+%

Page 4: Composer: Gestionando dependencias en PHP

Casi cualquier código que escribimos termina dependiendo de librerías de terceros (para que vamos a reinventar la rueda)

APP

D$p$%'$%)*,-

Page 5: Composer: Gestionando dependencias en PHP

Según van aumentando las dependencias se complica su gestión.

APP

D$p$%'$%)*,-

Page 6: Composer: Gestionando dependencias en PHP
Page 7: Composer: Gestionando dependencias en PHP

“Composer es una herramienta para la gestión de dependencias en aplicaciones PHP que permite definir las librerías de las que depende nuestro proyecto y se encarga de instalarlas de forma automática.”

¿Q(. $- C!"p#$r?

Page 8: Composer: Gestionando dependencias en PHP

¿Q(. $- C!"p#$r?

•  1ª released el 1 de Marzo de 2012

“Composer es una herramienta para la gestión de dependencias en aplicaciones PHP que permite definir las librerías de las que depende nuestro proyecto y se encarga de instalarlas de forma automática.”

Page 9: Composer: Gestionando dependencias en PHP

¿Q(. $- C!"p#$r?

•  1ª released el 1 de Marzo de 2012 •  Se inspira en NPM o Bundler

“Composer es una herramienta para la gestión de dependencias en aplicaciones PHP que permite definir las librerías de las que depende nuestro proyecto y se encarga de instalarlas de forma automática.”

Page 10: Composer: Gestionando dependencias en PHP

¿Q(. $- C!"p#$r?

•  1ª released el 1 de Marzo de 2012 •  Se inspira en NPM o Bundler •  100% PHP

“Composer es una herramienta para la gestión de dependencias en aplicaciones PHP que permite definir las librerías de las que depende nuestro proyecto y se encarga de instalarlas de forma automática.”

Page 11: Composer: Gestionando dependencias en PHP

¿Q(. $- C!"p#$r?

•  1ª released el 1 de Marzo de 2012 •  Se inspira en NPM o Bundler •  100% PHP •  Utiliza componentes de Symfony :)

“Composer es una herramienta para la gestión de dependencias en aplicaciones PHP que permite definir las librerías de las que depende nuestro proyecto y se encarga de instalarlas de forma automática.”

Page 12: Composer: Gestionando dependencias en PHP

¿Q(. $- C!"p#$r?

•  1ª released el 1 de Marzo de 2012 •  Se inspira en NPM o Bundler •  100% PHP •  Utiliza componentes de Symfony :) •  Permite autocargar nuestros paquetes

“Composer es una herramienta para la gestión de dependencias en aplicaciones PHP que permite definir las librerías de las que depende nuestro proyecto y se encarga de instalarlas de forma automática.”

Page 13: Composer: Gestionando dependencias en PHP

¿Q(. $- C!"p#$r?

•  1ª released el 1 de Marzo de 2012 •  Se inspira en NPM o Bundler •  100% PHP •  Utiliza componentes de Symfony :) •  Permite autocargar nuestros paquetes •  Muy simple de instalar y utilizar

“Composer es una herramienta para la gestión de dependencias en aplicaciones PHP que permite definir las librerías de las que depende nuestro proyecto y se encarga de instalarlas de forma automática.”

Page 14: Composer: Gestionando dependencias en PHP

PEAR fue y sigue siendo una opción viable, sin embargo, ha sido abandonada por muchos desarrolladores de PHP en los últimos años.

•  Trabaja a nivel global de sistema

•  Una versión por paquete y máquina

•  Sólo dist, no source

•  No permite diferentes orígenes

•  Dificultad para aportar nuevo paquetes

•  Gran número de paquetes desactualizados

¿Q(. !)(rr$ )!% PEAR?

Algunas razones:

Page 15: Composer: Gestionando dependencias en PHP

I%-&,/,)*+%

Page 16: Composer: Gestionando dependencias en PHP

Composer require PHP 5.3.2+

Instalación local:

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

$ curl -sS https://getcomposer.org/installer | php

Instalación global:

I%-&,/,r C!"p#$r

Page 17: Composer: Gestionando dependencias en PHP

I%-&,/,r C!"p#$r

Listado de comandos $ composer list

El comando help muestra información sobre un comando $ composer help install

Page 18: Composer: Gestionando dependencias en PHP

$ php composer.phar self-update

A)&(,/0,r C!"p#$r

Instalación local:

$ sudo composer self-update

Instalación global:

Page 19: Composer: Gestionando dependencias en PHP

U-,%'! C!"p#$r $% &( pr!1$)&!

Page 20: Composer: Gestionando dependencias en PHP

Las dependencias se definen en un archivo llamado composer.json Este fichero tiene que estar situado en la carpeta raíz del proyecto

$ cd ~/proyecto $ vim composer.json

D$2%*$%'! '$p$%'$%)*,-

Page 21: Composer: Gestionando dependencias en PHP

Nombre del paquete ‘creador’/’proyecto’

D$2%*$%'! '$p$%'$%)*,-

Las dependencias se definen en un archivo llamado composer.json Este fichero tiene que estar situado en la carpeta raíz del proyecto

$ cd ~/proyecto $ vim composer.json

Page 22: Composer: Gestionando dependencias en PHP

Nombre del paquete ‘creador’/’proyecto’

D$2%*$%'! '$p$%'$%)*,-

Las dependencias se definen en un archivo llamado composer.json Este fichero tiene que estar situado en la carpeta raíz del proyecto

$ cd ~/proyecto $ vim composer.json

Versión

Page 23: Composer: Gestionando dependencias en PHP

También es posible generar las dependencias de forma interactiva.

$ composer require silex/silex “~1.2”

$ composer init

Al ejecutar el comando init, tendrás que contestar varias preguntas cuyos valores se emplean para rellenar las opciones del archivo composer.json

Añade nuevas dependencias en el archivo composer.json y además instala o actualiza las dependencias

D$2%*$%'! '$p$%'$%)*,-

Page 24: Composer: Gestionando dependencias en PHP

1.2.3 : Versión específica, indica exactamente una versión.

>=1.0,<2.0 : Rango de versiones, operadores (>, >=, <, <=, !=)

1.0.* : Comodines, indican la versión requerida con un comodín (*)

~1.2 : Siguiente versión significativa, es equivalente a >=1.2,<2.0

V$r-*!%$- '$ p,q($&$-

Page 25: Composer: Gestionando dependencias en PHP

I%-&,/,%'! '$p$%'$%)*,- $ composer install

Page 26: Composer: Gestionando dependencias en PHP

I%-&,/,%'! '$p$%'$%)*,-

Nuestra dependencia

Page 27: Composer: Gestionando dependencias en PHP

I%-&,/,%'! '$p$%'$%)*,-

Nuestra dependencia

Dependencias de nuestra dependencia

Page 28: Composer: Gestionando dependencias en PHP

I%-&,/,%'! '$p$%'$%)*,-

Nuestra dependencia

Dependencias de nuestra dependencia

Sugerencias

Page 29: Composer: Gestionando dependencias en PHP

E-&r()&(r, '$ '*r$)&!r*#

Page 30: Composer: Gestionando dependencias en PHP

Definición de dependencias

E-&r()&(r, '$ '*r$)&!r*#

Page 31: Composer: Gestionando dependencias en PHP

E-&r()&(r, '$ '*r$)&!r*#

Fichero con versiones exactas instaladas

Page 32: Composer: Gestionando dependencias en PHP

E-&r()&(r, '$ '*r$)&!r*#

Carpeta donde se descargan las dependencias

Page 33: Composer: Gestionando dependencias en PHP

E-&r()&(r, '$ '*r$)&!r*#

Fichero de autocarga

Page 34: Composer: Gestionando dependencias en PHP

E-&r()&(r, '$ '*r$)&!r*#

Carpeta propia de composer para su gestión interna

Page 35: Composer: Gestionando dependencias en PHP

E-&r()&(r, '$ '*r$)&!r*#

Carpetas de paquetes descargados

Page 36: Composer: Gestionando dependencias en PHP

Después de instalar las dependencias, composer crea un archivo con las versiones exactas que ha instalado de cada librería.

$ composer install Usará composer.lock, si no existe utilizará composer.json y generará a composer.lock

$ composer update Usará composer.json y actualizará composer.lock

Versiona composer.lock en tu repositorio de código. Cualquier persona involucrada en el proyecto trabajará con las mismas versiones.

C!"p#$r./!)3

Page 37: Composer: Gestionando dependencias en PHP

A(&!/!,'*%4

Page 38: Composer: Gestionando dependencias en PHP

A(&!/!,'*%4

Page 39: Composer: Gestionando dependencias en PHP

R$p#*&!r*#

Page 40: Composer: Gestionando dependencias en PHP

•  Por defecto es el único que está disponible •  Es el repositorio central de Composer •  Actúa de proxy entre repositorios VCS y usuarios Composer •  Lugar donde encontrar librerías para tu proyecto •  Es de software libre, por lo que lo puedes instalar en tu servidor

Packagist

Es posible desactivar este repositorio:

5p! '$ r$p#*&!r*! C!"p#$r

Page 41: Composer: Gestionando dependencias en PHP

Satis Es una versión ultra-ligera y ultra-simplificada de Packagist. Ideal para proyectos privados, es muy fácil de usar.

5p! '$ r$p#*&!r*! C!"p#$r

Page 42: Composer: Gestionando dependencias en PHP

5p! '$ r$p#*&!r*! VCS (4*&, -v% …)

Page 43: Composer: Gestionando dependencias en PHP

5p! '$ r$p#*&!r*! PEAR

Page 44: Composer: Gestionando dependencias en PHP

5p! '$ r$p#*&!r*! P,)3,4$

Page 45: Composer: Gestionando dependencias en PHP

C!"! )r$,r (% p,q($&$ *%-&,/,b/$

Page 46: Composer: Gestionando dependencias en PHP

C!"! )r$,r (% p,q($&$ *%-&,/,b/$

1.  Creamos un fichero composer.json con la configuración del paquete

2.  Subimos el código a un repositorio, por ejemplo github

3.  Nos creamos una cuenta en Packagist.org y registramos nuestra librería diciéndole donde está el repositorio del código.

4.  ¡Ya podemos utilizar el paquete en nuestros proyectos!

Page 47: Composer: Gestionando dependencias en PHP

)!"p#$r.6-!%

Page 48: Composer: Gestionando dependencias en PHP

)!"p#$r.6-!%

Nombre del paquete (creador/proyecto) Es obligatorio, para publicar un paquete

Page 49: Composer: Gestionando dependencias en PHP

)!"p#$r.6-!%

Indica el tipo de paquete, que por defecto se establece a library.

Soporta por defecto 4 tipos: •  library •  project •  metapackage •  composer-installer

Page 50: Composer: Gestionando dependencias en PHP

)!"p#$r.6-!%

Se emplea para definir brevemente el propósito del paquete

Page 51: Composer: Gestionando dependencias en PHP

)!"p#$r.6-!%

Se trata de un array de palabras clave o etiquetas

Page 52: Composer: Gestionando dependencias en PHP

)!"p#$r.6-!%

Establece la URL del sitio web oficial del paquete

Page 53: Composer: Gestionando dependencias en PHP

)!"p#$r.6-!%

Indica la licencia bajo la que se publica el paquete

Page 54: Composer: Gestionando dependencias en PHP

)!"p#$r.6-!%

Indica el autor o autores del paquete

Page 55: Composer: Gestionando dependencias en PHP

)!"p#$r.6-!%

Para definir las dependencias del paquete que obligatoriamente de deben instalar

Page 56: Composer: Gestionando dependencias en PHP

)!"p#$r.6-!%

Esta propiedad permite configurar la carga automática de clases

Page 57: Composer: Gestionando dependencias en PHP

PHP-FIG

PHP-FIG: PHP Framework Interop Group

Es un grupo desarrolladores y representantes de la comunidad PHP, que se han unido con el ánimo de unificar el ecosistema de frameworks, librerías, componentes y aplicaciones desarrolladas en PHP.

PSR es la sigla de PHP Standards Recommendation

•  PSR-0: Autoloading Stándard •  PSR-1: Basic Coding Standard •  PSR-2: Coding Style Guide •  PSR-3: Logger Interface •  PSR-4: Improved Autoloading

http://www.php-fig.org

Page 58: Composer: Gestionando dependencias en PHP

5p# '$ A(&!/!,'*%4

Page 59: Composer: Gestionando dependencias en PHP

5p# '$ A(&!/!,'*%4

Autoload PSR-0

Algunos paquetes necesitan la propiedad "target-dir": "Symfony/Component/Yaml"

Por ejemplo PHPCaceres\Mylibrary\Class.php se ubicaría en: vendor/nombre_paquete/src/PhpCaceres/Library/Class.php

Page 60: Composer: Gestionando dependencias en PHP

5p# '$ A(&!/!,'*%4

Autoload PSR-4 (tipo recomendado)

Por ejemplo PHPCaceres\Mylibrary\Class.php se ubicaría en: vendor/nombre_paquete/Class.php

Page 61: Composer: Gestionando dependencias en PHP

5p# '$ A(&!/!,'*%4

Esta definición PSR-0 { "autoload": { "psr-0": {

"Foo\\Bar\\": "src/” } } }

Equivale a esta definición PSR-4 { "autoload": { "psr-4": {

"Foo\\Bar\\": "src/Foo/Bar/” } } }

Page 62: Composer: Gestionando dependencias en PHP

5p# '$ A(&!/!,'*%4

Otras librerías

Page 63: Composer: Gestionando dependencias en PHP

5p# '$ A(&!/!,'*%4

Helpers y funciones

Page 64: Composer: Gestionando dependencias en PHP

Op&*"0,%'! /, ,(&!),r4,

Es posible mejorar el rendimiento de la aplicación convirtiendo la carga automática de clases de PSR-0 y PSR-4 en un mapa de clases.

$ composer dump-autoload -o

También puedes hacerlo con los comandos install y update

$ composer install -o

$ composer update -o

Page 65: Composer: Gestionando dependencias en PHP

V$r-*+% '$/ P,q($&$

Formato X.Y.Z

Semantic versioning (http://semver.org)

Page 66: Composer: Gestionando dependencias en PHP

V$r-*+% '$/ P,q($&$

Formato X.Y.Z

Semantic versioning (http://semver.org)

Patch, solo arreglos o bug

Page 67: Composer: Gestionando dependencias en PHP

V$r-*+% '$/ P,q($&$

Formato X.Y.Z

Semantic versioning (http://semver.org)

Patch, solo arreglos o bug

Minor, nueva funcionalidad compatible con la versión anterior

Page 68: Composer: Gestionando dependencias en PHP

V$r-*+% '$/ P,q($&$

Formato X.Y.Z

Semantic versioning (http://semver.org)

Patch, solo arreglos o bug

Minor, nueva funcionalidad compatible con la versión anterior

Major, cambio no compatible con la versión anterior

Page 69: Composer: Gestionando dependencias en PHP

V$r-*+% '$/ P,q($&$

Podemos indicar la versión de forma explicita

{ "version": "1.0.0" }

Page 70: Composer: Gestionando dependencias en PHP

V$r-*+% '$/ P,q($&$

Basado en Tags

Basado en Ramas

•  1.0.0

•  v1.0.0 •  1.10.5-RC1

•  v5.6.10beta2

•  v2.2.2-alpha

•  v2.0.3-p1

Si el nombre de la rama se parece a una versión, el nombre de la versión será {nombre_de_rama}-dev si no dev-{nombre_de_rama}.

•  2.0.x-dev

•  dev-master

Si tenemos nuestro proyecto en SVN, la versión se obtiene automáticamente analizando sus Tags y Ramas

•  2.0.0.x-dev

•  dev-bugfix

Page 71: Composer: Gestionando dependencias en PHP

L, pr!p*$',' "*%*"("--&,b*/*&1

El valor por defecto es stable

{ "minimum-stability": "stable" }

Los valores disponibles para esta opción por orden ascendente: dev, alpha, beta, RC y stable

"dmd/dms": "1.0.0@dev"

Definir una dependencia para que pueda instalarse si tiene estabilidad inferior.

Page 72: Composer: Gestionando dependencias en PHP

D$2%*$%'! $/ ,/*,- '$ (%, r,",

Ya puedes indicar 1.0.* como versión del paquete y en realidad, estás instalando la versión dev-master.

Alias temporal: "monolog/monolog": "dev-bugfix as 1.0.x-dev"

Page 73: Composer: Gestionando dependencias en PHP

P,q($&$- '$/ -*-&$",

Permiten chequear las dependencias con PHP, sus extensiones y a algunas librerías del sistema

Representan a elementos instalados en tu servidor

$ composer show --platform

Page 74: Composer: Gestionando dependencias en PHP

P(b/*),r p,q($&$ $% P,)3,4*-&

Page 75: Composer: Gestionando dependencias en PHP

P(b/*),r p,q($&$ $% P,)3,4*-&

Page 76: Composer: Gestionando dependencias en PHP

P(b/*),r p,q($&$ $% P,)3,4*-&

Page 77: Composer: Gestionando dependencias en PHP

P(b/*),r p,q($&$ $% P,)3,4*-&

Page 78: Composer: Gestionando dependencias en PHP

P(b/*),r p,q($&$ $% P,)3,4*-&

Page 79: Composer: Gestionando dependencias en PHP

P(b/*),r p,q($&$ $% P,)3,4*-&

Page 80: Composer: Gestionando dependencias en PHP

S)r*p&-

Page 81: Composer: Gestionando dependencias en PHP

S)r*p&-

Permiten ejecutar acciones al producirse alguno de los eventos definidos por Composer

•  pre | post-install-cmd •  pre | post-update-cmd •  pre | post-package-install •  pre | post-package-update •  pre | post-package-uninstall •  pre | post-autoload-dump •  post-root-package-install •  post-create-project-cmd

Solamente se ejecutan los scripts del paquete principal, por lo que los scripts definidos en los archivos composer.json de las dependencias, no se ejecutan.

Page 82: Composer: Gestionando dependencias en PHP

S)r*p&-

Ejemplo de archivo de configuración composer.json con scripts:

Page 83: Composer: Gestionando dependencias en PHP

S)r*p&-

Ejemplo de como podría ser la clase MyVendor\MyClass:

Page 84: Composer: Gestionando dependencias en PHP

I%-&,/,'!r$-

Page 85: Composer: Gestionando dependencias en PHP

I%-&,/,'!r$-

Permiten personalizar la lógica de instalación de los paquetes.

Symfony2, Aura, Yii, Yii2 incluyen instaladores propios.

•  Drupal •  Laravel •  Magento •  WordPress •  CakePHP •  Moodle •  phpBB •  CodeIgniter •  ¡Y muchos más!

Podemos utilizar los instaladores oficiales: (https://github.com/composer/installers)

Page 86: Composer: Gestionando dependencias en PHP

U-,%'! (% *%-&,/,'!r

Este ejemplo muestra el fichero composer.json de un paquete que usa el instalador “phpdocumentor-template”

Page 87: Composer: Gestionando dependencias en PHP

U-,%'! (% *%-&,/,'!r

Tipo que determina el instalador.

Este ejemplo muestra el fichero composer.json de un paquete que usa el instalador “phpdocumentor-template”

Page 88: Composer: Gestionando dependencias en PHP

U-,%'! (% *%-&,/,'!r

Dependencia que añade el código del instalador.

Este ejemplo muestra el fichero composer.json de un paquete que usa el instalador “phpdocumentor-template”

Page 89: Composer: Gestionando dependencias en PHP

Cr$,%'! (% *%-&,/,'!r

Un instalador es un paquete compuesto como mínimo por dos archivos:

1.  Archivo composer.json de tipo composer-installer, que define el paquete

2.  Clase del instalador que implementa la interfaz Composer\Installer\InstallerInterface

•  supports() •  isInstalled() •  install() •  update() •  uninstall() •  getInstallPath()

Page 90: Composer: Gestionando dependencias en PHP

Cr$,%'! (% *%-&,/,'!r

Este ejemplo muestra el fichero composer.json de un paquete instalador.

Page 91: Composer: Gestionando dependencias en PHP

Cr$,%'! (% *%-&,/,'!r

Este ejemplo muestra el fichero composer.json de un paquete instalador.

Paquete de tipo instalador.

Page 92: Composer: Gestionando dependencias en PHP

Cr$,%'! (% *%-&,/,'!r

Este ejemplo muestra el fichero composer.json de un paquete instalador.

Clase del instalador.

Paquete de tipo instalador.

Page 93: Composer: Gestionando dependencias en PHP

Cr$,%'! (% *%-&,/,'!r

Page 94: Composer: Gestionando dependencias en PHP

I%-&,/,)*+% '$ S,&*-

Page 95: Composer: Gestionando dependencias en PHP

I%-&,/,)*+% '$ S,&*-

# composer create-project composer/satis –s dev!

1º- Instalamos SATIS con Composer ejecutando el siguiente comando:

Page 96: Composer: Gestionando dependencias en PHP

I%-&,/,)*+% '$ S,&*-

# composer create-project composer/satis –s dev!

1º- Instalamos SATIS con Composer ejecutando el siguiente comando:

2º- Definimos la configuración de SATIS, para ello, creamos el fichero satis.json en la carpeta de instalación.

Page 97: Composer: Gestionando dependencias en PHP

I%-&,/,)*+% '$ S,&*-

# php bin/satis build satis.json web/!

3º- Ejecutamos el siguiente comando para crear el repositorio de paquetes:

Satis lee el archivo de configuración satis.json y crea un repositorio estático de paquetes dentro del directorio web/

Se recomienda crear un cron con este comando para automatizar la actualización de nuestro repositorio.

Page 98: Composer: Gestionando dependencias en PHP

I%-&,/,)*+% '$ S,&*- 4º- Por último, crea un virtual host en tu servidor web que apunte al directorio web/ anterior y ya dispondrás de tu propio mini-Packagist.

Page 99: Composer: Gestionando dependencias en PHP

A/4(%,- )*fr,-

Page 100: Composer: Gestionando dependencias en PHP

A/4(%,- )*fr,-

4.461 forks

1.179 stars

Page 101: Composer: Gestionando dependencias en PHP

A/4(%,- )*fr,-

38.981 paquetes

Page 102: Composer: Gestionando dependencias en PHP

A/4(%,- )*fr,-

154.226 versiones

Page 103: Composer: Gestionando dependencias en PHP

A/4(%,- )*fr,-

350.254.159 paquetes instalados

(desde 13/04/2012)

Page 104: Composer: Gestionando dependencias en PHP

R$)(r-#

Page 105: Composer: Gestionando dependencias en PHP

R$)(r-#

•  getcomposer.org

•  librosweb.es/composer

•  packagist.org

•  github.com/composer

Page 106: Composer: Gestionando dependencias en PHP

¡Gr,)*,-! ¿Pr$4(%&,-?

Javier Núñez @javiernuber

[email protected]