Introducción a Composer

De Wiki de EGC
Saltar a: navegación, buscar

En PHP no existen herramientas tan asentadas y frecuentemente usadas para la gestión de la construcción de proyectos como en Java. No obstante, recientemente si que han aparecido varias de entre las que cabe destacar a Composer por su uso extendido. A diferencia de Maven, Composer se encarga exclusivamente de la gestión de dependencias por lo que no ofrece funcionalidades para la ejecución de las distintas tareas del proceso de construcción del proyecto.

La gestión de dependencias que realiza Composer es muy similar a la de Maven y, sobre todo, a la de NPM, que es un sistema de gestión de dependencias en Javascript.

Instalar Composer

La instalación de Composer requiere tener instalado PHP y poder acceder a él desde línea de comandos. Si no lo tienes instalado, una opción es utilizar la imagen de PHP de Docker de la siguiente forma:

% docker run -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp php:7.0-cli /bin/bash

Eso crea un contenedor con PHP 7.0 e inicia una sesión en terminal. Además, mapea el directorio actual al directorio /usr/src/myapp del contenedor. Por último, antes de usar Composer tenemos que instalar git y zip/unzip pues Composer los utiliza para descargarse las dependencias. Eso se puede hacer de la siguiente forma:

root@e20f7160c57c:/usr/src/example# apt-get update
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]
Ign http://deb.debian.org jessie InRelease                                  
Get:2 http://deb.debian.org jessie-updates InRelease [145 kB]
Get:3 http://security.debian.org jessie/updates/main amd64 Packages [588 kB] 
Get:4 http://deb.debian.org jessie Release.gpg [2373 B]                                 
Get:5 http://deb.debian.org jessie Release [148 kB]                                            
Get:6 http://deb.debian.org jessie-updates/main amd64 Packages [23.2 kB]                 
Get:7 http://deb.debian.org jessie/main amd64 Packages [9063 kB]
Fetched 10.0 MB in 5s (1865 kB/s)   
Reading package lists... Done

root@e20f7160c57c:/usr/src/example# apt-get install git
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  git-man less libcurl3-gnutls liberror-perl libexpat1 libpopt0 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6
  libxext6 libxmuu1 openssh-client rsync xauth
Suggested packages:
  gettext-base git-daemon-run git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-cvs
  git-mediawiki git-svn ssh-askpass libpam-ssh keychain monkeysphere openssh-server
Recommended packages:
  ssh-client
The following NEW packages will be installed:
  git git-man less libcurl3-gnutls liberror-perl libexpat1 libpopt0 libx11-6 libx11-data libxau6 libxcb1
  libxdmcp6 libxext6 libxmuu1 openssh-client rsync xauth
0 upgraded, 17 newly installed, 0 to remove and 1 not upgraded.
Need to get 7629 kB of archives.
After this operation, 33.5 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...

root@e20f7160c57c:/usr/src/example# apt-get install zip
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  unzip
The following NEW packages will be installed:
  unzip zip
0 upgraded, 2 newly installed, 0 to remove and 1 not upgraded.
Need to get 390 kB of archives.
After this operation, 1002 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...

Una vez tenemos nuestro contenedor listo, ya podemos instalar Composer siguiendo las instrucciones de su web:

root@e20f7160c57c:/usr/src# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
root@e20f7160c57c:/usr/src# php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Installer verified
root@e20f7160c57c:/usr/src# php composer-setup.php
All settings correct for using Composer
Downloading...

Composer (version 1.5.5) successfully installed to: /usr/src/composer.phar
Use it: php composer.phar

root@e20f7160c57c:/usr/src# php -r "unlink('composer-setup.php');"
root@e20f7160c57c:/usr/src# mv composer.phar /usr/local/bin/composer

De forma alternativa, se puede crear un Dockerfile con estos comandos:

FROM php:7.0-cli
RUN apt-get update && apt-get install -y git unzip zip --no-install-recommends && rm -r /var/lib/apt/lists/*
RUN mkdir -p /usr/src; \
      cd /usr/src; \
      php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"; \
      php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"; \
      php composer-setup.php; \
      php -r "unlink('composer-setup.php');"; \
      mv /usr/src/composer.phar /usr/local/bin/composer; \
      cd /

Crear una nueva imagen a partir de ese Dockerfile:

% docker build -t php:7.0-composer .

Y crear un contenedor con la nueva imagen:

% docker run -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp php:7.0-composer /bin/bash

Uso básico de Composer

Para ilustrar el funcionamiento de Composer vamos a añadir un par de dependencias a un proyecto en PHP. El equivalente en Composer al pom.xml de Maven es el fichero composer.json. Lo que ocurre es que, a diferencia de lo que ocurre en Maven, el fichero se puede editar directamente o podemos dejar que Composer lo vaya modificando de forma automática a partir de los comandos que vamos ejecutando en línea de comandos.

El fichero composer.json describe las dependencias del proyecto y puede tener también otros datos adicionales como el nombre o versión del proyecto. El elemento básico que se especifica en un composer.json es el elemento require. Simplemente sirve para decir los paquetes de los que depende el proyecto:

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

En este composer.json se está indicando que el proyecto depende de un paquete llamado monolog del desarrollador monolog y fija la versión a la 1.0.* (es decir, cualquiera que tenga 1.0).

Una vez que tenemos un composer.json creado en nuestro proyecto, podemos descargarnos todas sus dependencias mediante:

% composer install

El proceso es similar al de Maven y, al igual que Maven, existe un repositorio central donde se buscan por defecto los paquetes. Este repositorio se llama Packagist. Puedes encontrar más información sobre él en la documentación de Composer.

Si se quiere actualizar las dependencias a las últimas versiones se puede hacer:

% composer update

Scopes en las dependencias

Al igual que ocurre en Maven, es posible indicar varios scopes para las dependencias de un proyecto, aunque en Composer sólo hay dos scopes: normal, que significa que la dependencia se usa tanto en desarrollo como en ejecución y development, que significa que la dependencia se usa durante el desarrollo, por ejemplo, para ejecutar pruebas unitarias. La forma de indicarlo es que el elemento donde se indican las dependencias de desarrollo se llama require-dev:

{
    "require-dev": {
        "phpunit/phpunit": "^6.5"
    }
}

Composer por línea de comandos

El composer.json lo podemos editar nosotros directamente, igual que se hace en maven con el pom.xml, o podemos añadir o eliminar dependencias haciendo uso de la interfaz de línea de comandos de Composer. Para añadir dependencias se hace por medio de:

% composer require monolog/monolog
% composer require --dev phpunit/phpunit

Las dependencias se pueden eliminar utilizando:

% composer remove phpunit/phpunit

Ejercicio

  1. Instala Composer
  2. Crea un fichero composer.json con las siguientes dependencias:
    • Última versión del paquete psr/log
    • Versión igual o superior a la 1.2.0 del driver de mongodb
    • Versión superior a la 1.1.0 del SDK de Dropbox para PHP
    • Versión igual o superior a la 6 del framework de pruebas unitarias phpunit para desarrollo
  3. Descarga las dependencias en tu ordenador.

¿Vas rápido?

Echa un vistazo a https://getcomposer.org/doc/02-libraries.md y sigue el tutorial para hacer público un proyecto de hola mundo en PHP.