Composer: consejos de uso

Composer es una herramienta para gestionar dependencias en PHP. Permite declarar las bibliotecas de las que depende su proyecto y se encarga de instalarlas y actualizarlas por usted. Aprenderemos:

  • cómo instalar Composer
  • cómo usarlo en un proyecto nuevo o ya existente

Instalación

Composer es un archivo ejecutable .phar que se descarga e instala de la siguiente manera.

Windows

Use el instalador oficial Composer-Setup.exe.

Linux, macOS

Bastan 4 comandos, que puede copiar de esta página.

Además, copiándolo a una carpeta que esté en el PATH del sistema, Composer pasa a estar disponible globalmente:

$ mv ./composer.phar ~/bin/composer # o /usr/local/bin/composer

Uso en un proyecto

Para empezar a usar Composer en su proyecto solo necesita un archivo composer.json. Este archivo describe las dependencias de su proyecto y puede contener también otros metadatos. El composer.json más sencillo puede tener este aspecto:

{
	"require": {
		"nette/database": "^3.0"
	}
}

Aquí decimos que nuestra aplicación (o biblioteca) requiere el paquete nette/database (el nombre del paquete se compone del nombre del proveedor y del nombre del proyecto) y que quiere una versión que cumpla la restricción ^3.0 (es decir, la última versión 3).

Así pues, con el archivo composer.json en la raíz del proyecto, ejecute:

composer update

Composer descargará Nette Database en el directorio vendor/. También crea el archivo composer.lock, que contiene información sobre qué versiones exactas de las bibliotecas ha instalado.

Composer genera el archivo vendor/autoload.php. Basta con incluir este archivo y podrá empezar a usar las clases de las bibliotecas sin ningún trabajo adicional:

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

$db = new Nette\Database\Connection('sqlite::memory:');

Actualizar los paquetes a las últimas versiones

Para actualizar las bibliotecas usadas a las últimas versiones según las restricciones definidas en composer.json, use el comando composer update. Por ejemplo, con la dependencia "nette/database": "^3.0" instalará la última versión 3.x.x, pero no la versión 4.

Para actualizar las restricciones del archivo composer.json, por ejemplo a "nette/database": "^4.1", permitiendo así instalar la última versión, use el comando composer require nette/database.

Para actualizar todos los paquetes de Nette usados tendría que enumerarlos todos en la línea de comandos, p. ej.:

composer require nette/application nette/forms latte/latte tracy/tracy ...

Esto es poco práctico. Por eso, use el sencillo script Composer Frontline, que lo hará por usted:

php composer-frontline.php

Crear un proyecto nuevo

Puede crear un proyecto nuevo de Nette con un solo comando:

composer create-project nette/web-project name-of-the-project

Sustituya name-of-the-project por el nombre del directorio de su proyecto y ejecute el comando. Composer descargará de GitHub el repositorio nette/web-project, que ya contiene el archivo composer.json, y después instalará el propio Nette Framework. Solo queda establecer los permisos de los directorios temp/ y log/ y el proyecto debería estar en marcha.

Si sabe en qué versión de PHP se alojará su proyecto, no olvide indicarla.

Versión de PHP

Composer instala siempre versiones de los paquetes compatibles con la versión de PHP que usted usa en ese momento (en concreto, la versión de PHP usada en la línea de comandos al ejecutar Composer). Puede que no sea la misma versión que usa su hosting. Por eso es crucial añadir al archivo composer.json la información sobre la versión de PHP de su hosting. Entonces solo se instalarán versiones de los paquetes compatibles con él.

Por ejemplo, para indicar que el proyecto funcionará en PHP 8.2.3, use el comando:

composer config platform.php 8.2.3

La versión se escribirá en el archivo composer.json así:

{
	"config": {
		"platform": {
			"php": "8.2.3"
		}
	}
}

El número de la versión de PHP se indica, sin embargo, también en otro lugar del archivo, en la sección require. Mientras que el primer número determina la versión para la que se instalan los paquetes, el segundo indica la versión para la que está escrita la propia aplicación. PhpStorm, por ejemplo, lo usa para establecer el PHP language level. (Naturalmente, no tiene sentido que estas versiones difieran, así que la doble entrada es un descuido.) Establezca esta versión con el comando:

composer require php 8.2.3 --no-update

O directamente en el archivo composer.json:

{
	"require": {
		"php": "8.2.3"
	}
}

Ignorar la versión de PHP

Los paquetes suelen indicar tanto la versión mínima de PHP con la que son compatibles como la versión máxima con la que se han probado. Si tiene pensado usar una versión de PHP aún más nueva, quizá para hacer pruebas, Composer se negará a instalar un paquete así. La solución es la opción --ignore-platform-req=php+, que hace que Composer ignore los límites superiores de la versión de PHP requerida.

Avisos falsos

Al actualizar paquetes o cambiar números de versión se producen a veces conflictos. Un paquete tiene requisitos que chocan con los de otro, y así sucesivamente. Pero Composer emite a veces avisos falsos. Informa de un conflicto que en realidad no existe. En esos casos puede ayudar borrar el archivo composer.lock y volver a intentarlo.

Si el mensaje de error persiste, es real y hay que leerlo para entender qué hay que modificar y cómo.

Packagist.org: el repositorio global

Packagist es el repositorio principal en el que Composer busca los paquetes de forma predeterminada. También puede publicar aquí sus propios paquetes.

¿Y si no queremos el repositorio central?

Si dentro de nuestra empresa tenemos aplicaciones o bibliotecas internas que no se pueden alojar públicamente, podemos crear nuestros propios repositorios para ellas.

Más sobre los repositorios en la documentación oficial.

Autoloading

Una característica clave de Composer es que proporciona autoloading para todas las clases que instala. Se activa incluyendo el archivo vendor/autoload.php.

Pero también puede usar Composer para cargar otras clases de fuera del directorio vendor/. La primera opción es dejar que Composer recorra los directorios y subdirectorios definidos, encuentre todas las clases y las incluya en el autoloader. Para conseguirlo, configure autoload > classmap en composer.json:

{
	"autoload": {
		"classmap": [
		"src/",      # incluye el directorio src/ y sus subdirectorios
		]
	}
}

Después hay que ejecutar el comando composer dumpautoload tras cada cambio para regenerar las tablas de autoloading. Esto es extremadamente incómodo. Es mucho mejor encomendar esta tarea a RobotLoader, que hace lo mismo automáticamente en segundo plano y mucho más rápido.

La segunda opción es atenerse a PSR-4. Dicho de forma simple, es un sistema en el que los espacios de nombres y los nombres de las clases se corresponden con la estructura de directorios y los nombres de los archivos, p. ej. App\Core\RouterFactory estará en el archivo /path/to/App/Core/RouterFactory.php. Ejemplo de configuración:

{
	"autoload": {
		"psr-4": {
		"App\\": "app/"   # el espacio de nombres App\ está en el directorio app/
		}
	}
}

Consulte la documentación de Composer para saber cómo configurar este comportamiento.

Probar versiones nuevas

¿Quiere probar una nueva versión de desarrollo de un paquete? Así se hace. Primero, añada este par de opciones a su archivo composer.json. Eso permite instalar versiones de desarrollo, pero Composer solo recurrirá a ellas si ninguna combinación de versiones estables cumple los requisitos:

{
	"minimum-stability": "dev",
	"prefer-stable": true,
}

También recomendamos borrar el archivo composer.lock, porque Composer a veces se niega a instalar sin explicación y esto puede resolverlo.

Digamos que el paquete es nette/utils y la nueva versión es la 4.0. Instálelo con el comando:

composer require nette/utils:4.0.x-dev

O puede instalar una versión concreta, por ejemplo la 4.0.0-RC2:

composer require nette/utils:4.0.0-RC2

Sin embargo, si otro paquete depende de la biblioteca y está fijado a una versión más antigua (p. ej. ^3.1), la solución ideal es actualizar ese paquete dependiente para que funcione con la nueva versión. Pero si solo quiere saltarse la restricción y forzar a Composer a instalar la versión de desarrollo haciéndola pasar por una versión más antigua (p. ej. la 3.1.6), puede usar la palabra clave as:

composer require nette/utils "4.0.x-dev as 3.1.6"

Llamar a comandos

Puede llamar a sus propios comandos y scripts predefinidos a través de Composer como si fueran comandos nativos de Composer. Para los scripts que están en el directorio vendor/bin no hace falta indicar esa ruta.

Como ejemplo, definamos en composer.json un script que use Nette Tester para ejecutar los tests:

{
	"scripts": {
		"tester": "tester tests -s"
	}
}

Después ejecutamos los tests con composer tester. Puede llamar al comando aunque no esté en el directorio raíz del proyecto, sino en alguno de sus subdirectorios.

Dar las gracias

Le enseñamos un truco para alegrar a los autores de código abierto. Puede dar fácilmente estrellas en GitHub a las bibliotecas que usa su proyecto. Basta con instalar la biblioteca symfony/thanks:

composer global require symfony/thanks

Y después ejecutar:

composer thanks

¡Pruébelo!

Configuración

Composer está estrechamente integrado con la herramienta de control de versiones Git. Si no tiene Git instalado, hay que decirle a Composer que no lo use:

composer -g config preferred-install dist