Saltar al contenido principal

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"
}
}
CampoQue fai
nameNome do teu proxecto en formato vendor/nome. Non é obrigatorio, pero útil se vas publicar.
descriptionDescrición curta do proxecto. Informativo.
typeTipo de paquete (library, project, metapackage, etc.).
requireDependencias obrigatorias para o funcionamento da app (en produción).
require-devDependencias só necesarias en desenvolvemento (probas, ferramentas de estilo, etc.).
scriptsComandos 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.9 pero non 3.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.9 pero non 2.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:

FicheiroQuen o crea?Que contén?Para que serve?
composer.jsonO/A programador/aAs dependencias desexadas e versións permitidasDeclarar o que precisa o proxecto
composer.lockComposerAs versións exactas instaladasGarantir 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 ficheiro composer.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 ficheiro composer.json e resolve tódalas dependencias.
  • $ composer install --no-dev: Este comando procesa o ficheiro composer.json e 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 arquivos composer.json e composer.lock se o primeiro foi modificado manualmente.