Composer se ha convertido en una herramienta fundamental del ecosistema PHP. Se trata de un gestor de dependencias que nos facilita la siempre tediosa tarea de lidiar con las dependencias de nuestro proyecto. Los proyectos crecen y tienden a acumular grandes cantidades de dependencias y no siempre es fácil tenerlas actualizadas a la última versión, decidir qué versión instalar o instalar las dependencias de nuestras dependencias para que nada falle en esa cadena de confianza que se genera entre proyectos y librerías.

 

El uso de composer orbita alrededor de los ficheros composer.json, composer.lock y el directorio vendor, de manera que en nuestro proyecto únicamente tendremos que incluir el autoloader para cargar todas las dependencias. Una de las cosas que ha facilitado tanto la existencia como la rápida adopción de composer es la creación de estándares de autoload por parte del PHP-FIG (PSR-0 y más tarde PSR-4).

Vamos a ver paso a paso cómo instalar composer, establecer las dependencias de nuestro proyecto y cargarlas con una sola línea. A lo largo del artículo describiremos y utilizaremos algunos comandos, los relativos a composer son independientes del sistema operativo pero la instalación está basada en la máquina de vagrant ubuntu/xenial64 siguiendo los pasos del artículo Crea y gestiona tus entornos de desarrollo con Vagrant del que hablamos hace algún tiempo.

Instalar composer paso a paso

Para instalar la herramienta en Ubuntu tendremos que ejecutar únicamente un comando. Hecho esto vamos a hacer disponible el binario de manera global. Desde el terminal ejecutamos las siguientes instrucciones.

curl -s https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

Una vez ejecutado debemos comprobar que el paquete está listo para su uso, podemos ejecutar por ejemplo composer –version y la salida nos mostrará algo similar a lo siguiente

Composer version 1.3.2 2017-01-27 17:23:41

¿Cómo actualizar de composer?

Composer es una herramienta que pese a haber alcanzado la versión 1.0 en 2016 sigue en desarrollo y por tanto deberíamos actualizar con cierta frecuencia. Esto se consigue lanzando el comando composer self-update.

Empezando a usar composer

Para empezar a usar composer en un proyecto necesitaremos generar un fichero composer.json en el que especificaremos las dependencias del proyecto. Dentro del json usaremos la clave require para especificar nuestras dependencias que composer descargará usando packagist.

Packagist es el repositorio central en el que encontraremos el catálogo de paquetes disponibles para composer identificados usando cadenas del tipo vendor/package, por ejemplo la librería monolog la encontraremos referenciada como monolog/monolog. Si accedemos a la página correspondiente de la librería en packagist podremos ver información adicional como el comando para instalar el paquete usando composer, la url del repositorio en github, estadísticas del proyecto como instalaciones o paquetes que dependen a su vez de éste, sus requerimientos, versiones, etc.

El contenido mínimo del fichero composer.json con el que podríamos definir monolog como dependencia de nuestro proyecto para instalarla con composer sería el siguiente:

{
    "require": {
        "monolog/monolog": "1.*"
    }
}

Con este fichero en la carpeta podemos lanzar el comando composer install que nos mostrará paso a paso qué va sucediendo durante la instalación. En nuestro caso se instalará el paquete psr/log como dependencia de monolog y posteriormente el propio monolog/monolog que es nuestra dependencia.
Tras los paquetes instalados aparece una serie de paquetes sugeridos. Desde la página de packagist también podemos consultar estas dependencias sugeridas que normalmente nos permiten ampliar la funcionalidad del paquete instalado. Por ejemplo entre las sugerencias de monolog aparece mongodb/mongodb que nos permitiría enviar nuestros logs a un servidor mongodb.

Al final de la salida se muestran dos líneas más referentes a los últimos pasos que realiza composer al instalar:

Writing lock file
Generating autoload files

Con estas dos líneas nos especifica que se ha creado el fichero composer.lock en base a la instalación y el autoload del que hablabamos más arriba cuando mencionabamos PSR-4 como uno de los pilares fundamentales de composer que permite un uso tan cómodo de la herramienta.

Cuando ejecutamos composer install la aplicación trata de leer el fichero composer.lock en el que se especifica una serie de información, probablemente la más relevante sean las versiones exactas a instalar. Si no existe el fichero se resuelven las dependencias usando la información de composer.json y se genera el fichero composer.lock en base a la instalación realizada. En nuestro caso aparecerán entradas referentes a monolog/monolog 1.22.0 y a psr/log 1.0.2.

El fichero composer.lock nos va a permitir reinstalar exactamente las mismas dependencias una y otra vez. Pongamos por ejemplo que en el repositorio de nuestro proyecto incluimos el fichero composer.json, en unos meses se une un compañero al equipo e instala el proyecto desde cero en su máquina para empezar a desarrollar, si hay una versión más reciente que cumpla con la expresión 1.* será esa la que se le descargue, por ejemplo la 1.5.1 pudiendo ser incompatible con nuestro proyecto. En su caso se generaría un fichero composer.lock con la versión instalada que sería distinto a la nuestra.
Por el contrario si le facilitamos ambos ficheros al ejecutar composer install su proyecto contará exactamente con las mismas dependencias que el nuestro o que el servidor de producción.

Hasta aquí hemos realizado manualmente la edición de composer.json para especificar nuestras dependencias, hemos creado el fichero y hemos añadido las líneas necesarias pero podemos delegar estas acciones mecánicas en el propio composer.

Para generar el fichero composer.json usaremos el comando composer init que nos guiará a través de la creación del fichero, en nuestro caso lo único que haremos es darle nombre a nuestro proyecto como acceseo/composer-test y obviar el resto de pasos como aparece en nuestro terminal:

ubuntu@ubuntu-xenial:~$ composer init

Welcome to the Composer config generator
This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [ubuntu/ubuntu]: acceseo/composer-test
Description []:
Author [, n to skip]: n
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []:

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no

{
"name": "acceseo/composer-test",
"require": {}
}

Do you confirm generation [yes]? yes

Una vez confirmada la generación del fichero nos habrá generado el siguiente composer.json mínimo con el nombre del proyecto y sin dependencias:

{
"name": "acceseo/composer-test",
"require": {}
}

Para llegar al punto que hemos alcanzado antes necesitamos establecer como dependencia de nuestro proyecto la librería monolog, y descargar nuestras dependencias. Esto lo haríamos con el comando composer require de la siguiente manera: composer require monolog/monolog:1.*

La aplicación nos mostrará una salida similar a la de composer install especificando qué paquetes y versiones se han instalado, las sugerencias, generación del lock, etc como ya hemos tratado, pero además nos especificará que se está actualizando el fichero composer.json.

Utilizando nuestras dependencias

Hasta ahora hemos hablado de composer como tal, pero la finalidad de gestionar nuestras dependencias con composer es por un lado ahorrarnos gestionar manualmente el árbol de dependencias y por otro facilitar el uso de las dependencias en nuestro código olvidándonos de decenas de require necesarios en cada fichero.

Una vez instaladas las dependencias se ha generado la carpeta vendors de la que he no hemos hablado hasta ahora, esa carpeta es la que almacena los paquetes descargados y los ficheros necesarios para el autoload.

Para empezar a usar monolog únicamente tendríamos que importar en nuestro código el fichero /vendors/autoload.php, vamos a usar el ejemplo que hay disponible en el fichero readme.md de monolog para ver cómo haríamos esto. En el mismo directorio que tenemos el fichero composer.json creamos el fichero composer-test.php con el siguiente contenido.

En este fichero con una sola línea podemos cargar todas las dependencias y utilizarlas sin realizar ningún paso extra más.

<?php
require __DIR__.'/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler(__DIR__.'/monolog.log', Logger::WARNING));

// add records to the log
$log->warning('Foo');
$log->error('Bar');

Al ejecutar el script se nos generará el fichero monolog.log correspondiente sin errores de clases o funciones no definidas.

Aunque hemos tratado un ejemplo sencillo a lo largo del artículo composer se utiliza extensivamente en los proyectos PHP más importantes del mundo, ya que nos permite hacer muchas más cosas que quedan fuera del alcance de la introducción que hemos llevado a cabo.

He leído y estoy conforme con la Política de Privacidad.