Composer
Composer é un xestor de dependencias para PHP que crea un ficheiro chamado composer.json na raíz do proxecto que, ao executar un só comando, descarga automaticamente tódalas dependencias que necesita o proxecto.
Cabe destacar que Composer funciona por proxecto e non de xeito global. É dicir, descarga as dependencias necesarias para cada proxecto que realices en PHP, aínda que é compatible con instalacións globais.
Instalación
Neste enlace podes encontrar como instalar Composer. Para utilizalo é necesario ter instalado PHP.
Instalación en Debian
Un xeito rápido de instalar PHP xunto a Composer e executar os seguintes comandos:
Actualizamos a lista de paquetes:
sudo apt update
Instalamos PHP e cURL (será necesario para poder lanzar o instalador de composer) e PHP:
sudo apt install php curl
Pode ser útil instalar algunhas extensións de PHP. A continuación, inclúense as máis comúns:
sudo apt install php-cli php-mbstring php-xml php-curl php-bcmath php-ctype php-json php-pdo php-tokenizer php-fileinfo unzip
Descargamos o script PHP de instalación e mediante un pipeline executamos dito script co intérprete de PHP:
curl -sS https://getcomposer.org/installer | php
Movemos a xestor a este directorio para poder utilizalo sen escribila ruta completa
sudo mv composer.phar /usr/local/bin/composer
Tras a instalación podemos comprobar tanto versión de PHP como a de Composer cos seguintes comandos:
$ php -v
$ composer --version
Ficheiros de Composer
Cada proxecto conta cun dous ficheiros de dependencias de nome composer.json e composer.lock.
Ficheiro composer.json
O ficheiro composer.json é creado por ti (mediante composer init) e declara as dependencias que o teu proxecto necesita para funcionar.
Vexamos un exemplo do ficheiro composer.json:
{
"name": "usuario/proxecto-exemplo",
"description": "Un proxecto PHP de exemplo para aprender Composer",
"type": "project",
"require": {
"monolog/monolog": "^2.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.0"
},
"scripts": {
"test": "phpunit"
}
}
| Campo | Que fai |
|---|---|
name | Nome do teu proxecto en formato vendor/nome. Non é obrigatorio, pero útil se vas publicar. |
description | Descrición curta do proxecto. Informativo. |
type | Tipo de paquete (library, project, metapackage, etc.). |
require | Dependencias obrigatorias para o funcionamento da app (en produción). |
require-dev | Dependencias só necesarias en desenvolvemento (probas, ferramentas de estilo, etc.). |
scripts | Comandos personalizados que podes executar con composer run test, etc. |
Composer permite indicar versións de paquetes de xeito flexible. Aquí van os formatos máis comúns:
-
Exacta: Instala exactamente unha.
"monolog/monolog": "2.0.1" -
Intervalo compatible (
^): Instala a versión 2.x máis recente, pero non cambia de versión maior. Inclúe:2.0,2.1,2.9pero non3.0."monolog/monolog": "^2.0" -
Intervalo menor (
~): Permite actualizacións menores, pero mantén a versión principal e menor fixas. Inclúe:2.0.1,2.0.9pero non2.1,3.0."monolog/monolog": "~2.0" -
Rango manual: Control total do rango permitido.
"monolog/monolog": ">=2.0 <3.0"
Ficheiro composer.lock
En cambio composer.lock é xerado automaticamente por Composer cando instalas ou actualizas dependencias (composer install ou composer update). Non deberías modificalo a man. Serve para:
- Garda as versións exactas que se instalaron no momento.
- Inclúe todas as dependencias directas e indirectas (as que requiren outras librarías).
- Asegura que calquera outra persoa que instale o proxecto obteña exactamente as mesmas versións, para evitar erros por diferenzas.
Cada vez que se instala un paquete, se actualiza ou elimina, actualízanse ambos ficheiros.
En resumo:
| Ficheiro | Quen o crea? | Que contén? | Para que serve? |
|---|---|---|---|
composer.json | O/A programador/a | As dependencias desexadas e versións permitidas | Declarar o que precisa o proxecto |
composer.lock | Composer | As versións exactas instaladas | Garantir reproducibilidade entre entornos |
Os paquetes almacénanse no directorio de nome vendor dentro do proxecto.
Paquetes con versións concretas
A concreción das versión dos paquetes é unha boa práctica polos seguintes motivos:
- Garantir reproducibilidade: Se non concretas versións, cada persoa que instale o proxecto pode obter versións diferentes das dependencias. Isto pode facer que a aplicación funcione nun equipo e rompa noutro. Con versións fixas, todos teñen o mesmo comportamento.
- Evitar cambios inesperados: Se alguén fai unha instalación unha semana despois, pode instalarse a mesma versión ou unha nova. Rómpense a compatibilidade por cambios internos.
Paquetes de desenvolvemento
Existen paquetes que só se deben de instalar nun contorno de desenvolvemento. Os paquetes de desenvolvemento son dependencias que non se necesitan para que a aplicación funcione en produción, senón que só se usan mentres estás a desenvolver, probar ou manter o proxecto.
É importante separalos por:
- Produción máis lixeira: Non se instalan paquetes innecesarios ao despregar (menos peso, menos riscos).
- Seguridade: Moitos paquetes de desenvolvemento teñen permisos amplos e acceso ao sistema. Non deberían estar en produción.
Comandos
Algúns comandos importantes son:
$ composer: mostra a axuda desta ferramenta.$ composer init: servirá para crear o ficheirocomposer.json.$ composer require <librería>: Instala unha librería.$ composer require <librería>:<version>: Instala unha librería nunha versión concreta.$ composer require <librería> --dev: Instala unha librería só no contorno de desenvolvemento.$ composer require <librería>:<version> --dev: Instala unha librería nunha versión concreta só no contorno de desenvolvemento.$ composer remove <librería>: Elimina unha librería.$ composer install: Este comando procesa o ficheirocomposer.jsone resolve tódalas dependencias.$ composer install --no-dev: Este comando procesa o ficheirocomposer.jsone resolve tódalas dependencias necesarias para produción.$ composer update: Actualiza as dependencias do proxecto a última versión. Tamén serve para sincronizar os arquivoscomposer.jsonecomposer.lockse o primeiro foi modificado manualmente.