composer: gestionando dependencias en php
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
Gestionando dependencias en PHP
C!"p#$r
Javier Núñez @javiernuber
Septiembre 2014
I%&r!'())*+%
Casi cualquier código que escribimos termina dependiendo de librerías de terceros (para que vamos a reinventar la rueda)
APP
D$p$%'$%)*,-
Según van aumentando las dependencias se complica su gestión.
APP
D$p$%'$%)*,-
“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?
¿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.”
¿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.”
¿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.”
¿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.”
¿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.”
¿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.”
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:
I%-&,/,)*+%
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
I%-&,/,r C!"p#$r
Listado de comandos $ composer list
El comando help muestra información sobre un comando $ composer help install
$ php composer.phar self-update
A)&(,/0,r C!"p#$r
Instalación local:
$ sudo composer self-update
Instalación global:
U-,%'! C!"p#$r $% &( pr!1$)&!
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$%'$%)*,-
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
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
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$%'$%)*,-
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($&$-
I%-&,/,%'! '$p$%'$%)*,- $ composer install
I%-&,/,%'! '$p$%'$%)*,-
Nuestra dependencia
I%-&,/,%'! '$p$%'$%)*,-
Nuestra dependencia
Dependencias de nuestra dependencia
I%-&,/,%'! '$p$%'$%)*,-
Nuestra dependencia
Dependencias de nuestra dependencia
Sugerencias
E-&r()&(r, '$ '*r$)&!r*#
Definición de dependencias
E-&r()&(r, '$ '*r$)&!r*#
E-&r()&(r, '$ '*r$)&!r*#
Fichero con versiones exactas instaladas
E-&r()&(r, '$ '*r$)&!r*#
Carpeta donde se descargan las dependencias
E-&r()&(r, '$ '*r$)&!r*#
Fichero de autocarga
E-&r()&(r, '$ '*r$)&!r*#
Carpeta propia de composer para su gestión interna
E-&r()&(r, '$ '*r$)&!r*#
Carpetas de paquetes descargados
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
A(&!/!,'*%4
A(&!/!,'*%4
R$p#*&!r*#
• 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
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
5p! '$ r$p#*&!r*! VCS (4*&, -v% …)
5p! '$ r$p#*&!r*! PEAR
5p! '$ r$p#*&!r*! P,)3,4$
C!"! )r$,r (% p,q($&$ *%-&,/,b/$
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!
)!"p#$r.6-!%
)!"p#$r.6-!%
Nombre del paquete (creador/proyecto) Es obligatorio, para publicar un paquete
)!"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
)!"p#$r.6-!%
Se emplea para definir brevemente el propósito del paquete
)!"p#$r.6-!%
Se trata de un array de palabras clave o etiquetas
)!"p#$r.6-!%
Establece la URL del sitio web oficial del paquete
)!"p#$r.6-!%
Indica la licencia bajo la que se publica el paquete
)!"p#$r.6-!%
Indica el autor o autores del paquete
)!"p#$r.6-!%
Para definir las dependencias del paquete que obligatoriamente de deben instalar
)!"p#$r.6-!%
Esta propiedad permite configurar la carga automática de clases
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
5p# '$ A(&!/!,'*%4
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
5p# '$ A(&!/!,'*%4
Autoload PSR-4 (tipo recomendado)
Por ejemplo PHPCaceres\Mylibrary\Class.php se ubicaría en: vendor/nombre_paquete/Class.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/” } } }
5p# '$ A(&!/!,'*%4
Otras librerías
5p# '$ A(&!/!,'*%4
Helpers y funciones
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
V$r-*+% '$/ P,q($&$
Formato X.Y.Z
Semantic versioning (http://semver.org)
V$r-*+% '$/ P,q($&$
Formato X.Y.Z
Semantic versioning (http://semver.org)
Patch, solo arreglos o bug
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
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
V$r-*+% '$/ P,q($&$
Podemos indicar la versión de forma explicita
{ "version": "1.0.0" }
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
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.
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"
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
P(b/*),r p,q($&$ $% P,)3,4*-&
P(b/*),r p,q($&$ $% P,)3,4*-&
P(b/*),r p,q($&$ $% P,)3,4*-&
P(b/*),r p,q($&$ $% P,)3,4*-&
P(b/*),r p,q($&$ $% P,)3,4*-&
P(b/*),r p,q($&$ $% P,)3,4*-&
S)r*p&-
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.
S)r*p&-
Ejemplo de archivo de configuración composer.json con scripts:
S)r*p&-
Ejemplo de como podría ser la clase MyVendor\MyClass:
I%-&,/,'!r$-
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)
U-,%'! (% *%-&,/,'!r
Este ejemplo muestra el fichero composer.json de un paquete que usa el instalador “phpdocumentor-template”
U-,%'! (% *%-&,/,'!r
Tipo que determina el instalador.
Este ejemplo muestra el fichero composer.json de un paquete que usa el instalador “phpdocumentor-template”
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”
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()
Cr$,%'! (% *%-&,/,'!r
Este ejemplo muestra el fichero composer.json de un paquete instalador.
Cr$,%'! (% *%-&,/,'!r
Este ejemplo muestra el fichero composer.json de un paquete instalador.
Paquete de tipo instalador.
Cr$,%'! (% *%-&,/,'!r
Este ejemplo muestra el fichero composer.json de un paquete instalador.
Clase del instalador.
Paquete de tipo instalador.
Cr$,%'! (% *%-&,/,'!r
I%-&,/,)*+% '$ S,&*-
I%-&,/,)*+% '$ S,&*-
# composer create-project composer/satis –s dev!
1º- Instalamos SATIS con Composer ejecutando el siguiente comando:
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.
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.
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.
A/4(%,- )*fr,-
A/4(%,- )*fr,-
4.461 forks
1.179 stars
A/4(%,- )*fr,-
38.981 paquetes
A/4(%,- )*fr,-
154.226 versiones
A/4(%,- )*fr,-
350.254.159 paquetes instalados
(desde 13/04/2012)
R$)(r-#
R$)(r-#
• getcomposer.org
• librosweb.es/composer
• packagist.org
• github.com/composer