Consejos de uso de Composer

Composer es una herramienta para la gestión de dependencias en PHP. Te permite declarar las librerías de las que depende tu proyecto y las instalará y actualizará por ti. Aprenderemos:

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

Instalación

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

Windows

Utilice el instalador oficial Composer-Setup.exe.

Linux, macOS

Todo lo que necesitas son 4 comandos, que puedes copiar de esta página.

Además, al copiar en la carpeta que se encuentra en el sistema PATH, Composer se convierte en accesible a nivel mundial:

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

Uso en el proyecto

Para empezar a utilizar Composer en su proyecto, todo lo que necesita es un archivo composer.json. Este archivo describe las dependencias de tu proyecto y puede contener también otros metadatos. El composer.json más simple puede tener este aspecto:

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

Estamos diciendo aquí, que nuestra aplicación (o biblioteca) depende del paquete nette/database (el nombre del paquete consiste en un nombre de proveedor y el nombre del proyecto) y quiere la versión que coincida con la restricción de versión ^3.0.

Entonces, cuando tenemos el archivo composer.json en la raíz del proyecto y ejecutamos:

composer update

Composer descargará la base de datos Nette en el directorio vendor. También creará un archivo composer.lock, que contiene información sobre las versiones exactas de las librerías que ha instalado.

Composer genera un archivo vendor/autoload.php. Puedes simplemente incluir este archivo y empezar a usar las clases que esas librerías proporcionan sin ningún trabajo extra:

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

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

Actualizar paquetes a las últimas versiones

Para actualizar todos los paquetes utilizados a la última versión según las restricciones de versión definidas en composer.json utilice el comando composer update. Por ejemplo, para la dependencia "nette/database": "^3.0" instalará la última versión 3.x.x, pero no la versión 4.

Para actualizar las restricciones de versión en el archivo composer.json a, por ejemplo, "nette/database": "^4.1", para permitir la instalación de la última versión, utilice el comando composer require nette/database.

Para actualizar todos los paquetes Nette utilizados, sería necesario listarlos todos en la línea de comandos, p. ej:

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

Lo cual es poco práctico. Por lo tanto, utilice un simple script Composer Frontline que lo hará por usted:

php composer-frontline.php

Crear nuevo proyecto

Se puede crear un nuevo proyecto Nette ejecutando un simple comando:

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

En lugar de name-of-the-project debe proporcionar el nombre del directorio para su proyecto y ejecutar el comando. Composer obtendrá el repositorio nette/web-project de GitHub, que ya contiene el archivo composer.json, y justo después instalará el propio Nette Framework. La única cosa que queda es comprobar los permisos de escritura en los directorios temp/ y log/ y ya está listo para ir.

Si sabes en qué versión de PHP se alojará el proyecto, asegúrate de configurarlo.

Versión PHP

Composer siempre instala las versiones de los paquetes que son compatibles con la versión de PHP que está utilizando actualmente (o más bien, la versión de PHP utilizada en la línea de comandos cuando se ejecuta Composer). Que probablemente no es la misma versión que utiliza su proveedor de alojamiento web. Por eso es muy importante añadir información sobre la versión de PHP de tu alojamiento a tu archivo composer.json. Después de eso, sólo se instalarán las versiones de paquetes compatibles con el host.

Por ejemplo, para configurar el proyecto para que se ejecute en PHP 8.2.3, utilice el comando:

composer config platform.php 8.2.3

Así se escribe la versión en el archivo composer.json:

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

Sin embargo, el número de versión de PHP también aparece en otra parte del archivo, en la sección require. Mientras que el primer número especifica la versión para la que se instalarán los paquetes, el segundo indica para qué versión está escrita la aplicación. (Por supuesto, no tiene sentido que estas versiones sean diferentes, así que la doble entrada es una redundancia). Esta versión se establece con el comando

composer require php 8.2.3 --no-update

O directamente en el archivo composer.json:

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

Ignorando la versión de PHP

Los paquetes suelen especificar tanto la versión más baja de PHP con la que son compatibles como la versión más alta con la que han sido probados. Si planea usar una versión aún más nueva de PHP, quizás para propósitos de prueba, Composer se rehusará a instalar dicho paquete. La solución es utilizar la opción --ignore-platform-req=php+, que hace que Composer ignore los límites superiores de la versión PHP requerida.

Informes falsos

Cuando se actualizan paquetes o se cambian los números de versión, surgen conflictos. Un paquete tiene requisitos que entran en conflicto con otro y así sucesivamente. Sin embargo, Composer ocasionalmente imprime un mensaje falso. Informa de un conflicto que realmente no existe. En este caso, ayuda borrar el archivo composer.lock e intentarlo de nuevo.

Si el mensaje de error persiste, entonces va en serio y hay que leer en él qué modificar y cómo.

Packagist.org – Repositorio global

Packagist es el repositorio principal de paquetes, en el que Composer intenta buscar paquetes, si no se le indica lo contrario. También puede publicar sus propios paquetes aquí.

¿Y si no queremos el repositorio central?

Si tenemos aplicaciones o librerías internas en nuestra empresa, que no pueden ser alojadas públicamente en Packagist, podemos crear nuestros propios repositorios para esos proyectos.

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

Carga automática

Una característica clave de Composer es que proporciona autoloading para todas las clases que instala, que se inicia mediante la inclusión de un archivo vendor/autoload.php.

Sin embargo, también es posible utilizar Composer para cargar otras clases fuera de la carpeta vendor. La primera opción es dejar que Composer explore las carpetas y subcarpetas definidas, encuentre todas las clases y las incluya en el autoloader. Para ello, configure autoload > classmap en composer.json:

{
	"autoload": {
		"classmap": [
			"src/",      #  includes the src/ folder and its subfolders
		]
	}
}

Posteriormente, es necesario ejecutar el comando composer dumpautoload con cada cambio y dejar que se regeneren las tablas de autocarga. Esto es extremadamente incómodo, y es mucho mejor confiar esta tarea a RobotLoader, que realiza la misma actividad automáticamente en segundo plano y mucho más rápido.

La segunda opción es seguir PSR-4. En pocas palabras, se trata de 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, es decir, App\Core\RouterFactory se encuentra en el archivo /path/to/App/Core/RouterFactory.php. Ejemplo de configuración:

{
	"autoload": {
		"psr-4": {
			"App\\": "app/"   # the App\ namespace is in the app/ directory
		}
	}
}

Ver Documentación de Composer para saber exactamente cómo configurar este comportamiento.

Probar nuevas versiones

Desea probar una nueva versión de desarrollo de un paquete. ¿Cómo hacerlo? En primer lugar, añada este par de opciones al archivo composer.json, que le permitirán instalar versiones de desarrollo de paquetes, pero sólo lo harán si no existe una combinación de versiones estables que cumpla los requisitos:

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

También recomendamos borrar el archivo composer.lock, porque a veces Composer rechaza incomprensiblemente la instalación y esto solucionará el problema.

Digamos que el paquete es nette/utils y la nueva versión es 4.0. Lo instalas con el comando

composer require nette/utils:4.0.x-dev

O puedes instalar una versión específica, por ejemplo 4.0.0-RC2:

composer require nette/utils:4.0.0-RC2

Si otro paquete depende de la biblioteca y está bloqueado a una versión anterior (por ejemplo ^3.1), lo ideal es actualizar el paquete para que funcione con la nueva versión. Sin embargo, si sólo quieres evitar la limitación y forzar a Composer a instalar la versión de desarrollo y fingir que es una versión anterior (por ejemplo, 3.1.6), puedes utilizar la palabra clave as:

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

Llamada a comandos

Puede llamar a sus propios comandos y scripts personalizados a través de Composer como si fueran comandos nativos de Composer. Los scripts ubicados en la carpeta vendor/bin no necesitan especificar esta carpeta.

Como ejemplo, definimos un script en el archivo composer.json que utiliza Nette Tester para ejecutar pruebas:

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

A continuación, ejecutamos las pruebas con composer tester. Podemos invocar el comando aunque no nos encontremos en la carpeta raíz del proyecto, sino en un subdirectorio.

Enviar Gracias

Te vamos a enseñar un truco que hará felices a los autores de código abierto. Puedes dar fácilmente una estrella en GitHub a las bibliotecas que utiliza tu proyecto. Sólo tienes que instalar la biblioteca symfony/thanks:

composer global require symfony/thanks

Y luego ejecuta

composer thanks

¡Inténtalo!

Configuración

Composer está estrechamente integrado con la herramienta de control de versiones Git. Si no utiliza Git, es necesario indicárselo a Composer:

composer -g config preferred-install dist