Composer: consejos para su uso
Composer es una herramienta para gestionar dependencias en PHP. Nos permite enumerar las librerías de las que depende nuestro proyecto, y las instalará y actualizará por nosotros. Mostraremos:
- cómo instalar Composer
- su uso en un proyecto nuevo o existente
Instalación
Composer es un archivo .phar
ejecutable, que descarga e instala de la siguiente manera:
Windows
Use el instalador oficial Composer-Setup.exe.
Linux, macOS
Bastarán 4 comandos, que puede copiar de esta página.
Además, insertándolo en una carpeta que esté en el PATH
del sistema, Composer se volverá accesible
globalmente:
$ mv ./composer.phar ~/bin/composer # o /usr/local/bin/composer
Uso en el proyecto
Para poder empezar a usar Composer en su proyecto, necesita solo el archivo composer.json
. Este describe las
dependencias de nuestro proyecto y también puede contener otros metadatos. Un composer.json
básico, por lo tanto,
puede verse así:
{
"require": {
"nette/database": "^3.0"
}
}
Aquí decimos que nuestra aplicación (o librería) requiere el paquete nette/database
(el nombre del paquete se
compone del nombre de la organización y el nombre del proyecto) y quiere una versión que cumpla la condición ^3.0
(es decir, la última versión 3).
Tenemos, por lo tanto, en la raíz del proyecto el archivo composer.json
y ejecutamos la instalación:
composer update
Composer descargará Nette Database en la carpeta vendor/
. Además, creará el archivo composer.lock
,
que contiene información sobre qué versiones exactas de las librerías instaló.
Composer generará el archivo vendor/autoload.php
, que podemos simplemente incluir y empezar a usar las librerías
sin ningún trabajo adicional:
require __DIR__ . '/vendor/autoload.php';
$db = new Nette\Database\Connection('sqlite::memory:');
Actualización de paquetes a las últimas versiones
La actualización de las librerías usadas a las últimas versiones según las condiciones definidas en
composer.json
está a cargo del comando composer update
. Por ejemplo, para la dependencia
"nette/database": "^3.0"
instalará la última versión 3.x.x, pero ya no la versión 4.
Para actualizar las condiciones en el archivo composer.json
, por ejemplo a "nette/database": "^4.1"
,
para poder instalar la última versión, use el comando composer require nette/database
.
Para actualizar todos los paquetes Nette usados sería necesario enumerarlos 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. Use por lo tanto el script simple Composer Frontline, que lo hará por usted:
php composer-frontline.php
Creación de un nuevo proyecto
Creará un nuevo proyecto en Nette con un solo comando:
composer create-project nette/web-project nombre-proyecto
Como nombre-proyecto
inserte el nombre del directorio para su proyecto y confirme. Composer descargará el
repositorio nette/web-project
de GitHub, que ya contiene el archivo composer.json
, e inmediatamente
después Nette Framework. Ya debería bastar con establecer los permisos de
escritura en las carpetas temp/
y log/
y el proyecto debería cobrar vida.
Si sabe en qué versión de PHP se alojará el proyecto, no olvide configurarla.
Versión de PHP
Composer siempre instala aquellas versiones de paquetes que son compatibles con la versión de PHP que está usando actualmente
(mejor dicho, con la versión de PHP usada en la línea de comandos al ejecutar Composer). Lo cual, sin embargo, probablemente no
sea la misma versión que usa su hosting. Por lo tanto, es muy importante agregar al archivo composer.json
información sobre la versión de PHP en el hosting. Después, solo se instalarán versiones de paquetes compatibles con el
hosting.
Que el proyecto se ejecutará, por ejemplo, en PHP 8.2.3, lo configuramos con 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 se indica también en otro lugar del archivo, en la sección require
.
Mientras que el primer número determina para qué versión se instalarán los paquetes, el segundo número dice para qué
versión está escrita la propia aplicación. Y según él, por ejemplo, PhpStorm establece el PHP language level. (Por
supuesto, no tiene sentido que estas versiones difieran, por lo que la doble escritura es una falta de previsión.) Esta versión
la establece 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 generalmente suelen tener indicada tanto la versión más baja de PHP con la que son compatibles, como la más
alta con la que están probados. Si se dispone a usar una versión de PHP aún más nueva, por ejemplo, con fines de prueba,
Composer se negará a instalar tal paquete. 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.
Informes falsos
Al actualizar paquetes o cambiar números de versión, sucede que se produce un conflicto. Un paquete tiene requisitos que
están en conflicto con otro y similares. Composer, sin embargo, a veces emite informes falsos. Informa de un conflicto que
realmente no existe. En tal caso, ayuda eliminar el archivo composer.lock
e intentarlo de nuevo.
Si el mensaje de error persiste, entonces se toma en serio y es necesario leer de él qué y cómo modificar.
Packagist.org – repositorio central
Packagist es el repositorio principal en el que Composer intenta buscar paquetes, si no le decimos lo contrario. Aquí también podemos publicar nuestros propios paquetes.
¿Y si no queremos usar el repositorio central?
Si tenemos aplicaciones internas de la empresa, que simplemente no podemos alojar públicamente, entonces crearemos un repositorio de empresa para ellas.
Más sobre el tema de repositorios en la documentación oficial.
Autoloading
Una característica fundamental de Composer es que proporciona autoloading para todas las clases instaladas por él, que inicia
incluyendo el archivo vendor/autoload.php
.
Sin embargo, es posible usar Composer también para cargar otras clases incluso 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. Esto se logra configurando autoload > classmap
en composer.json
:
{
"autoload": {
"classmap": [
"src/", # incluye la carpeta src/ y sus subcarpetas
]
}
}
Posteriormente, es necesario ejecutar el comando composer dumpautoload
cada vez que se realice un cambio y dejar
que las tablas de autoloading se regeneren. 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 cumplir con PSR-4. Simplificando, se trata de un sistema
donde los espacios de nombres y los nombres de las clases corresponden a la estructura de directorios y los nombres de los
archivos, es decir, 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/
}
}
}
Cómo configurar exactamente el comportamiento se aprende en la documentación de Composer.
Prueba de nuevas versiones
Quiere probar una nueva versión de desarrollo de un paquete. ¿Cómo hacerlo? Primero, agregue al archivo
composer.json
este par de opciones, que permiten instalar versiones de desarrollo de paquetes, pero recurrirá a ello
solo si no existe ninguna combinación de versiones estables que cumpla los requisitos:
{
"minimum-stability": "dev",
"prefer-stable": true,
}
Además, recomendamos eliminar el archivo composer.lock
, a veces Composer inexplicablemente se niega a la
instalación y esto resuelve el problema.
Supongamos que se trata del paquete nette/utils
y la nueva versión tiene el número 4.0. La instala con el
comando:
composer require nette/utils:4.0.x-dev
O puede instalar una versión específica, por ejemplo 4.0.0-RC2:
composer require nette/utils:4.0.0-RC2
Pero si otro paquete depende de la librería, que está bloqueado en una versión anterior (p. ej., ^3.1
),
entonces lo ideal es actualizar el paquete para que funcione con la nueva versión. Sin embargo, si solo quiere eludir la
restricción y forzar a Composer a instalar la versión de desarrollo y fingir que es una versión anterior (p. ej., 3.1.6), puede
usar la palabra clave as
:
composer require nette/utils "4.0.x-dev as 3.1.6"
Llamada de comandos
A través de Composer se pueden llamar comandos y scripts propios pre-preparados, como si fueran comandos nativos de Composer.
Para los scripts que se encuentran en la carpeta vendor/bin
, no es necesario indicar esta carpeta.
Como ejemplo, definimos en el archivo composer.json
un script que usando Nette Tester ejecuta las pruebas:
{
"scripts": {
"tester": "tester tests -s"
}
}
Las pruebas luego las ejecutamos con composer tester
. El comando podemos llamarlo incluso si no estamos en la
carpeta raíz del proyecto, sino en algún subdirectorio.
Envíe un agradecimiento
Le mostraremos un truco con el que complacerá a los autores de código abierto. De manera simple, dará una estrella en GitHub
a las librerías que usa su proyecto. Basta con instalar la librería symfony/thanks
:
composer global require symfony/thanks
Y luego ejecutar:
composer thanks
¡Pruébelo!
Configuración
Composer está estrechamente vinculado con la herramienta de versionado Git. Si no la tiene instalada, es necesario decirle a Composer que no la use:
composer -g config preferred-install dist